Я не хочу, чтобы он трансформировался, вместо этого я хочу, чтобы он отображался в виде плоской двумерной метки, которая всегда обращена к камере и всегда остается одинакового размера на экране. Однако, если оно скрыто за чем-то, я хочу, чтобы оно было скрыто.
Во-первых, вы должны были поставить , что в вашем вопросе; это объясняет гораздо больше о том, что вы пытаетесь сделать, чем ваш вопрос.
Для этого вам нужно найти координату z в ортографической проекции, которая совпадает с координатой z в предпроективном пространстве того места, где должна отображаться метка.
Когда вы использовали gluProject
, вы получили три координаты назад. Координата Z важна. Что вам нужно сделать, это обратное преобразование координаты Z на основе значений zNear и zFar, которые вы задаете для glOrtho
.
Педантическое примечание: gluProject
не преобразует координату Z в пространство окна. Для этого необходимо принять параметры glDepthRange
. Что он на самом деле делает, так это принимает диапазон глубины около 0,0 и далеко = 1,0.
Итак, наш первый шаг - преобразование из пространства Z окна в пространство Z нормализованной координаты устройства (NDC). Мы используем это простое уравнение:
ndcZ = (2 * winZ) - 1
Достаточно просто. Теперь нам нужно перейти в пространство клипа. Что является недопустимым, поскольку в ортографической проекции координата W принимается равной 1,0. А деление на W - это разница между пространством клипа и пространством NDC.
clipZ = ndcZ
Но нам не нужно пространство клипа Z. Нам нужно пространство доортографической проекции Z (иначе: пространство камеры Z). А для этого нужны параметры zNear и zFar, которые вы задали для glOrtho
. Чтобы попасть в пространство камеры, мы делаем это:
cameraZ = ((clipZ + (zFar + zNear)/(zFar - zNear)) * (zFar - zNear))/-2
И все готово. Используйте эту позицию Z в вашем рендеринге. Да, и убедитесь, что ваша матрица вида модели не содержит каких-либо преобразований в направлении Z (если только вы не используете матрицу вида модели для применения этой позиции Z к метке, что нормально).