DirectX 9. Есть единичный куб, есть камера, которая на него смотрит. Можно вывести мировые координаты куба. А как узнать его экранные координаты (с помощью каких манипуляций\функций)?
Если считать их вручную, то, по сути, мне надо проделать все преобразования вручную, т.е. самому перемножать все матрицы, выполнять вращение, что достаточно долго и сложно.
Сразу извиняюсь за глупый вопрос
Ramm
> Если считать их вручную, то, по сути, мне надо проделать все преобразования
> вручную, т.е. самому перемножать все матрицы, выполнять вращение, что
> достаточно долго и сложно.
Используй для расчетов компьютер.
Ramm
+ к ответу dave
На компьютере считать все гораздо удобнее, гарантирую.
Ramm
> ... самому перемножать все матрицы, выполнять вращение, что
> достаточно долго и сложно.
>
Если ты решил заняться созданием игр и считаешь, что это долго и сложно, то знай, что дальше будет еще хуже, дольше и сложнее. Беги пока можешь!
Ramm
> А как узнать его экранные координаты (с помощью каких манипуляций\функций)?
А зачем, если не секрет нужны именно экранные координаты куба? Какое этому практическое применение?
Если требуется кликать по кубу мышкой, то тут обычно начинают от экранных координат курсора мыши, а не нарисованного объекта. Если нужно это, то ищи по "mouse picking". Материала полно.
Ramm
> Если считать их вручную, то, по сути, мне надо проделать все преобразования
> вручную, т.е. самому перемножать все матрицы, выполнять вращение, что
> достаточно долго и сложно.
Эм, если перемножение 3-х матриц это сложно, то лучше дальше не продолжать ибо с твоим походом будет сложно все.
Digan
> А зачем, если не секрет нужны именно экранные координаты куба? Какое этому
> практическое применение?
1. Mouse picking.
2. Для LODов. Если видимый размер куба меньше определённого порога, можно уменьшить детализацию.
3. Для автоматической системы управления камерой. Если куб на экране вышел за допустимую область, нужно повернуть камеру, чтобы не выходил.
alexzzzz
> 1. Mouse picking.
в другую сторону же все делаю обычно: из места клика пускают луч и проверяют его пересечение с объектом.
alexzzzz
> 2. Для LODов. Если видимый размер куба меньше определённого порога, можно
> уменьшить детализацию.
Вроде LOD обычно зависит от удаленности объекта от камеры, а не от размеров объекта на экране.
alexzzzz
> 3. Для автоматической системы управления камерой. Если куб на экране вышел за
> допустимую область, нужно повернуть камеру, чтобы не выходил.
Рискну предположить, что если куб не влезает в экран значит он будет пересекаться хотя бы с одной плоскость усеченной пирамиды. Тогда можно просто проверить пересекает или нет. Если пересечет повернуть камеру.
Ramm
> Если считать их вручную, то, по сути, мне надо проделать все преобразования
> вручную, т.е. самому перемножать все матрицы, выполнять вращение, что
> достаточно долго и сложно.
А ты подумай как это делает DirectX - ты уже объявил все нужные для этого матрицы. DirectX ими же пользуется? Если ты заправишь в этот конвейер нужную мировую координату, то на выходе получишь вектор в экранных координатах. Разбирай шейдеры - если не лезть ручками в конвейер, то и смысла никакого в использовании напрямую Direct'а сейчас нет.
Digan
> Вроде LOD обычно зависит от удаленности объекта от камеры, а не от размеров
> объекта на экране.
Обычно это где?
Я могу просто посмотреть на лоды в разном масштабе и решить, что при размере в 25%..10% надо показывать второй лод, а при 10% и меньше - 2д прокси.
Как мне так же на глаз определить расстояния, которые напрямую зависят от FOV и физических размеров объекта?
Digan
> > 2. Для LODов. Если видимый размер куба меньше определённого порога, можно
> > уменьшить детализацию.
> Вроде LOD обычно зависит от удаленности объекта от камеры, а не от размеров
> объекта на экране.
Уровень LOD зависит от удалённости от камеры, от FOV камеры (игрок смотрит в бинокль, FOV маленький) и от реальных размеров объекта (скамейка парке vs небоскрёб). По видимому на экране размеру делать правильнее.
> > 3. Для автоматической системы управления камерой. Если куб на экране вышел за
> > допустимую область, нужно повернуть камеру, чтобы не выходил.
> Рискну предположить, что если куб не влезает в экран значит он будет
> пересекаться хотя бы с одной плоскость усеченной пирамиды. Тогда можно просто
> проверить пересекает или нет. Если пересечет повернуть камеру.
Хорошая камера должна уметь доворачиваться, не дожидаясь, пока объект выпадет из кадра. Есть некоторая область вокруг центра экрана. Если объект всё ещё в кадре, но уже выпал из этой области, нужно его туда вернуть.
-Eugene-
> Как мне так же на глаз определить расстояния, которые напрямую зависят от FOV и
> физических размеров объекта?
м.б. как расстояние от камеры до AABB объекта?)
Digan
> м.б. как расстояние от камеры до AABB объекта?)
И что мне даст расстояние в, например, 24 метра? Много это или мало?
Конкретно в игровом объекте/модели прописывается список типа "на 100 попугаях заменить на скамейку_лод1, на 200 попугаях заменить на скамейку_лод2, от 300 попугаев и дальше - прятать с глаз долой".
Попугаи, само собой, считаются от центра камеры до центра объекта/модели.
Конкретные значения забиваются вручную, ибо в общем случае, их нахождение - задача нетривиальная, как и генерация этих самых лодов, от качества которых диапазоны попугаев в том числе зависят. "Нетривиальная" в смысле "проще сделать вручную".
alexzzzz
> Хорошая камера должна уметь доворачиваться, не дожидаясь, пока объект выпадет
> из кадра. Есть некоторая область вокруг центра экрана. Если объект всё ещё в
> кадре, но уже выпал из этой области, нужно его туда вернуть.
Факт выпадения запросто определяется векторной алгеброй. Требуемые действия - зависят от условий. В вакууме достаточно повернуть камеру. В комнате, рабочая тактика - нарисовать сплайн вручную и катать камеру по нему.
Delfigamer
> Конкретно в игровом объекте/модели прописывается список типа "на 100 попугаях
> заменить на скамейку_лод1, на 200 попугаях заменить на скамейку_лод2, от 300
> попугаев и дальше - прятать с глаз долой".
Игрок смотрит на дерево. На дереве сидит белочка. Расстояние от камеры до белочки 200 метров. На таком расстоянии её можно было бы и вообще не рисовать, но... Игрок смотрит через оптический прицел, белочка у него на пол экрана и поэтому должна быть нарисована в полной детализации.
Тема в архиве.