Как изменить свойство Entity при наведении на него курсора мыши в Ogre3d? ⇐ C++
-
Гость
Как изменить свойство Entity при наведении на него курсора мыши в Ogre3d?
Я загрузил базовую модель куба при запуске приложения:
Entity* Cube = scnMgr->createEntity("box.glb"); CubeNode = scnMgr->getRootSceneNode()->createChildSceneNode(); CubeNode->attachObject(куб); CubeNode->setPosition(Vector3(0.0f, 0.0f, 0.0f)); Затем в методе InputListener mouseMoved(evt):
int x = evt.x; int y = evt.y; // получаем луч из позиции мыши Ogre::Camera* camera = scnMgr->getCamera("MainCamera"); Ogre::Ray ray = camera->getCameraToViewportRay(x / float(getRenderWindow()->getWidth()), y / float(getRenderWindow()->getHeight())); // Выполняем приведение лучей, чтобы проверить, находится ли курсор мыши над объектом Ogre::RaySceneQuery* query = scnMgr->createRayQuery(ray); запрос->setSortByDistance(истина); // Выполняем запрос Ogre::RaySceneQueryResult& queryResult = query->execute(); если (!queryResult.empty()) { // Курсор мыши находится над объектом Ogre::RaySceneQueryResult::iterator it = queryResult.begin(); Ogre::MovableObject* object = it->movable; // Изменяем цвет наведенного объекта если (объект) { если (hoveredNode) { // Сбрасываем цвет предыдущего объекта Объект MovableObject* = hoveredNode->getAttachedObject(0); Ogre::Entity* hoveredEntity = Dynamic_cast(hoveredNode->getAttachedObject(0)); если (hoveredEntity) { ChangeColor(hoveredEntity, ColourValue(1.0f,0.0f,0.0f)); //ЦВЕТ НЕ МЕНЯЕТСЯ printf("Здесь измените цвет"); //НО ЭТО ПЕЧАТАЕТСЯ } } hoveredNode = объект->getParentSceneNode(); //printf("здесь измените цвет"); // Изменяем цвет } } еще { // Ни один объект не наведен если (hoveredNode) { //printf("здесь измените цвет"); // Сбрасываем цвет предыдущего объекта hoveredNode = nullptr; } } Вот моя функция изменения цвета
voidchangeColor(объект Entity*, цвет ColourValue) { Материал MaterialPtr = object->getSubEntity(0)->getMaterial(); Pass* pass = материал->getTechnique(0)->getPass(0); pass->setDiffuse(цвет); } Обнаружено наведение мыши, но цвет объекта не меняется, и я не могу понять, почему Пожалуйста, сообщите
Изменить: Я многое понял:
[*]После того как объект прикрепляется к Ogre::SceneNode, он сохраняется как объект Ogre::MovableObject. [*]Этот MO можно получить из узла, используя его имя Entity::getName() ИЛИ его индекс с помощью SceneNode::getAttachedObject(str name /*or*/ int index) [*]После этого нам нужно преобразовать MovableObject обратно в Entity с помощью: dynamic_cast
Я считаю, что проблема где-то здесь, поскольку ошибок точно не возникает. Хотя модель представляет собой просто куб без иерархии, мне придется распечатать иерархию, и я считаю, что именно так мне следует ее отлаживать.
Редактирование 2: Я распечатал иерархию объектов при наведении на объект. Это правильный код. Проблема заключается в том, как менялся цвет.
Я обнаружил, что использование SubEntity::setMaterial() для назначения другого материала работает, но когда я установил другой цвет для того же материала, что и в changeColor, цвет не меняется, никаких ошибок нет.
Вот как я создаю материал:
MaterialPtr hoverMaterial = MaterialManager::getSingleton().create("hoverMaterial", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); Pass* pass = hoverMaterial->getTechnique(0)->getPass(0); pass->setDiffuse(ColourValue (1.0f, 0.0f,0.0f)); Это проблема с обновлением? (Я надеюсь, что те из нас, кто использовал ThreeJS в Интернете, увидят здесь сходство.) Нужно ли мне как-то сообщать рендереру, что этот материал обновлен?
Я загрузил базовую модель куба при запуске приложения:
Entity* Cube = scnMgr->createEntity("box.glb"); CubeNode = scnMgr->getRootSceneNode()->createChildSceneNode(); CubeNode->attachObject(куб); CubeNode->setPosition(Vector3(0.0f, 0.0f, 0.0f)); Затем в методе InputListener mouseMoved(evt):
int x = evt.x; int y = evt.y; // получаем луч из позиции мыши Ogre::Camera* camera = scnMgr->getCamera("MainCamera"); Ogre::Ray ray = camera->getCameraToViewportRay(x / float(getRenderWindow()->getWidth()), y / float(getRenderWindow()->getHeight())); // Выполняем приведение лучей, чтобы проверить, находится ли курсор мыши над объектом Ogre::RaySceneQuery* query = scnMgr->createRayQuery(ray); запрос->setSortByDistance(истина); // Выполняем запрос Ogre::RaySceneQueryResult& queryResult = query->execute(); если (!queryResult.empty()) { // Курсор мыши находится над объектом Ogre::RaySceneQueryResult::iterator it = queryResult.begin(); Ogre::MovableObject* object = it->movable; // Изменяем цвет наведенного объекта если (объект) { если (hoveredNode) { // Сбрасываем цвет предыдущего объекта Объект MovableObject* = hoveredNode->getAttachedObject(0); Ogre::Entity* hoveredEntity = Dynamic_cast(hoveredNode->getAttachedObject(0)); если (hoveredEntity) { ChangeColor(hoveredEntity, ColourValue(1.0f,0.0f,0.0f)); //ЦВЕТ НЕ МЕНЯЕТСЯ printf("Здесь измените цвет"); //НО ЭТО ПЕЧАТАЕТСЯ } } hoveredNode = объект->getParentSceneNode(); //printf("здесь измените цвет"); // Изменяем цвет } } еще { // Ни один объект не наведен если (hoveredNode) { //printf("здесь измените цвет"); // Сбрасываем цвет предыдущего объекта hoveredNode = nullptr; } } Вот моя функция изменения цвета
voidchangeColor(объект Entity*, цвет ColourValue) { Материал MaterialPtr = object->getSubEntity(0)->getMaterial(); Pass* pass = материал->getTechnique(0)->getPass(0); pass->setDiffuse(цвет); } Обнаружено наведение мыши, но цвет объекта не меняется, и я не могу понять, почему Пожалуйста, сообщите
Изменить: Я многое понял:
[*]После того как объект прикрепляется к Ogre::SceneNode, он сохраняется как объект Ogre::MovableObject. [*]Этот MO можно получить из узла, используя его имя Entity::getName() ИЛИ его индекс с помощью SceneNode::getAttachedObject(str name /*or*/ int index) [*]После этого нам нужно преобразовать MovableObject обратно в Entity с помощью: dynamic_cast
Я считаю, что проблема где-то здесь, поскольку ошибок точно не возникает. Хотя модель представляет собой просто куб без иерархии, мне придется распечатать иерархию, и я считаю, что именно так мне следует ее отлаживать.
Редактирование 2: Я распечатал иерархию объектов при наведении на объект. Это правильный код. Проблема заключается в том, как менялся цвет.
Я обнаружил, что использование SubEntity::setMaterial() для назначения другого материала работает, но когда я установил другой цвет для того же материала, что и в changeColor, цвет не меняется, никаких ошибок нет.
Вот как я создаю материал:
MaterialPtr hoverMaterial = MaterialManager::getSingleton().create("hoverMaterial", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); Pass* pass = hoverMaterial->getTechnique(0)->getPass(0); pass->setDiffuse(ColourValue (1.0f, 0.0f,0.0f)); Это проблема с обновлением? (Я надеюсь, что те из нас, кто использовал ThreeJS в Интернете, увидят здесь сходство.) Нужно ли мне как-то сообщать рендереру, что этот материал обновлен?
Мобильная версия