Search the Community
Showing results for tags 'coordinates'.
-
Задумал на экране отобразить длинную прямоугольную шкалу показывающую, например, здоровье. Я так понял что для этого можно использовать WidgetCanvas, ибо он позволяет отображать самые произвольные фигуры из точек и даже текстурные полигоны. Для начала я добавил сам WidgetCanvas и задал ему размер (в пикселях), и определенный цвет: auto pGui = Gui::get(); static auto pCanvas = WidgetCanvas::create(pGui); pCanvas->setPosition(10,10); pCanvas->setWidth(200); pCanvas->setHeight(200); pCanvas->setColor({1.0f,1.0f,1.0f,0.5f}); pGui->addChild(pCanvas, Gui::ALIGN_OVERLAP | Gui::ALIGN_FIXED); В итоге я получил нечто вот такое: То есть, я так понимаю, WidgetCanvas заданного размера был успешно добавлен на GUI. Далее я попытался отобразить на этом canvas хотя-бы один треугольник, и заметил что там используются 3D координаты точек (то есть подразумевается что у canvas по умолчанию стоит какая-то матрица проекции или что-то вроде того). Предположив что ось Z (либо -Z) уходит вдаль, ось X идет вправо, а Y вверх, я решил добавить треугольник со следующими точками: нижняя левая, верхняя левая, верхняя правая: auto pid = pCanvas->addPolygon(); pCanvas->setPolygonColor(pid, {0.8f,0.4f,0.0f,1.0f}); pCanvas->addPolygonPoint(pid,{-1.0f,-1.0f,0.0f}); pCanvas->addPolygonPoint(pid,{-1.0f,1.0f,0.0f}); pCanvas->addPolygonPoint(pid,{1.0f,1.0f,0.0f}); В итоге у меня ничего не отобразилось. Как был белый полупрозрачный квадрат, так и остался. Я подумал что вероятно не хватает той самой матрицы проекции. Я решил добавить просто перспективную проекцию: pCanvas->setTransform(Math::perspective(45.0f,1.0f,0.0f,100.0f)); И в итоге я получил вот это: Треугольник как-то отобразился, но почему-то в качестве вью-порта использовался не квадратик canvas'а, а основной вью-порт, и треугольник вылез за пределы canvas'а. В чем вообще дело? В каких координатах необходимо задавать точки? Какая там проекция по умолчанию? Я попробовал использовать ортогональную проекцию: pCanvas->setTransform(Math::ortho(-1.0f,1.0f,-1.0f,1.0f,0.0f,100.0f)); Но тогда треугольник вовсе исчезает. Можете подсказать в каких координатах нужно работать? Как, например, просто отобразить прямоугольник, который бы покрывал полностью весь canvas? Заранее спасибо.
-
Hi, I need the 2D screen Position of a 3D Node transformation. Can you write me a short code example with unigine matrices form the Player and Node and perspective division to get the NDC coordinates? auto proj = m_player->getProjection(); auto view = m_player->getTransform(); auto obj = instance->second->getNode()->getTransform(); auto projectedPosition = Unigine::Math::Mat4(proj)*view*obj*Unigine::Math::Vec4(0.0, 0.0, 0.0, 1.0); projectedPosition /= glm::abs(projectedPosition.w); x = (projectedPosition.x+1.0f)*0.5f * m_ungineAppHandle->getWidth(); y = (1.f-(projectedPosition.z+1.0f)*0.5f) * m_ungineAppHandle->getHeight(); Thank you in advance, Sebastian