Как изменить свойство Entity при наведении на него курсора мыши в Ogre3d?C++

Программы на 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 в Интернете, увидят здесь сходство.) Нужно ли мне как-то сообщать рендереру, что этот материал обновлен?
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»