Воскресенье, 22 Декабря 2024, 15:49

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Перевод экранных координат в мировые.
AlexsSyrДата: Среда, 20 Июля 2016, 21:54 | Сообщение # 1
почетный гость
Сейчас нет на сайте
Подскажите пожалуйста как с помощью матричных преобразований перевести экранные координаты в мировые ?
Пробовал матрицу вида умножить на матрицу проекции, затем инвертировать их произведение. Потом 2D координаты умножить на эту инвертированную матрицу.
Однако возвращает значение далеко не такое какое должно быть.
SaiteiДата: Четверг, 21 Июля 2016, 02:22 | Сообщение # 2
старожил
Сейчас нет на сайте
Цитата AlexsSyr ()
Подскажите пожалуйста как с помощью матричных преобразований перевести экранные координаты в мировые ?
Пробовал матрицу вида умножить на матрицу проекции, затем инвертировать их произведение. Потом 2D координаты умножить на эту инвертированную матрицу.
Однако возвращает значение далеко не такое какое должно быть.

1)Перемножь Projection и View
2)Инвертируй результат умножения
3)Построй vec4:
x = mouse_position.x (диапазон: -1..1)
y = mouse_position.y (диапазон: -1..1)
z = depth
w = 1.0
4)умножь вектор на инвертированную матрицу
5)после умножения подели на w (из vec4)
AlexsSyrДата: Четверг, 21 Июля 2016, 13:07 | Сообщение # 3
почетный гость
Сейчас нет на сайте
А чему должен быть равен depth ?
SaiteiДата: Четверг, 21 Июля 2016, 16:24 | Сообщение # 4
старожил
Сейчас нет на сайте
AlexsSyr, глубине (расстоянию до позиции камеры)
ArchidoДата: Суббота, 23 Июля 2016, 10:00 | Сообщение # 5
Сэнсэй
Сейчас нет на сайте
AlexsSyr
Для программиста крайне важно уметь пользоваться гуглом - это очень важный скилл, который экономит кучу времени (: Первая же сылка ведет на stackoverflow, откуда тов. Saitei любезно перевел и предоставил тут всю информацию. Почему бы и самому так не уметь? (: Там даже и код есть (:
Все таки форумы более полезны для обсуждения более конкретных деталей \ вопросов, что легко (или вообще) нагуглить не выйдет. Просто мои 5 копеек.

P.S. По глубине скажу, что ее можно взять (прочитать) из depth буфера \ текстуры, либо из полученных координат x,y без конечного z, строить луч по направлению камеры и искать пересечения со всеми объектами, выбирая при этом минимальное расстояние. Последний способ не нуждается во всяких Lock'ах текстур и вообще GAPI независим, но покодить надо будет малость побольше:) Такие дела.


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
AlexsSyrДата: Среда, 10 Августа 2016, 12:45 | Сообщение # 6
почетный гость
Сейчас нет на сайте
Посмотрел статью, переписал под LWJGL. Что-то работает не корректно.

Матрица проекции
Код

////////////////////////////////////
camera.SetProjection(90, 0.1f, 8);
/////////////////////////////

  public void SetProjection(float angle, float nearPlace, float farPlace)
    {
        float aspectRatio = (float)Display.getWidth() / (float)Display.getHeight();
        float y_scale = (float)(1f / Math.tan(Math.toRadians(angle / 2f))) * aspectRatio;
        float x_scale = y_scale / aspectRatio;
        float frustum_length = farPlace - nearPlace;
        
        Projection.m00 = x_scale;
        Projection.m11 = y_scale;
        Projection.m22 = -((farPlace + nearPlace) / frustum_length);
        Projection.m23 = -1;
        Projection.m32 = -((2 * nearPlace * farPlace) / frustum_length);
        Projection.m33 = 0;
        
    }



Матрица вида

Код

camera.rx = 90;
camera.y = 8;
camera.SetView();
////////////////////////////////////////

public void SetView()
    {
        View.setIdentity();
        Matrix4f.rotate((float)Math.toRadians(rx), new Vector3f(1,0,0), View, View);
        Matrix4f.rotate((float)Math.toRadians(ry), new Vector3f(0,1,0), View, View);
        Matrix4f.rotate((float)Math.toRadians(rz), new Vector3f(0,0,1), View, View);
        Matrix4f.translate(new Vector3f(-x,-y,z), View, View);
    }


Код

  public static Vector4f UnProject(Camera cam, Point2f pos)
    {
     
    Matrix4f VPinvert = new Matrix4f();
    Vector4f Res = new Vector4f();
    
    float winZ = 1;
    
    float x = Main.Zoom;
    
    Res.x =(2.0f*((float)(pos.x-0)/(Display.getWidth()-0)))-1.0f;
    Res.y =1.0f-(2.0f*((float)(pos.y-0)/(Display.getHeight()-0)));
//   Res.z = (float)(2.0 * winZ -1.0);

  Res.z = 1;
    Res.w = (float) 1.0;      
    
    Matrix4f.mul(cam.View, cam.Projection, VPinvert);
    Matrix4f.invert(VPinvert, VPinvert);
    
    Res.x = (Res.x * VPinvert.m00) + (Res.y * VPinvert.m10) + (Res.z * VPinvert.m20) + (Res.w * VPinvert.m30);
    Res.y = (Res.x * VPinvert.m01) + (Res.y * VPinvert.m11) + (Res.z * VPinvert.m21) + (Res.w * VPinvert.m31);
    Res.z = (Res.x * VPinvert.m02) + (Res.y * VPinvert.m12) + (Res.z * VPinvert.m22) + (Res.w * VPinvert.m32);
    Res.w = (Res.x * VPinvert.m03) + (Res.y * VPinvert.m13) + (Res.z * VPinvert.m23) + (Res.w * VPinvert.m33);    
    
    Res.x /= Res.w;
    Res.y /= Res.w;
    Res.z /= Res.w;
    
    return Res;
        
    }


Нажима на точку с координатами (1,1), получаю значения (0.004219624;0.16776733;-0.033905927;29.493368)
В чём проблема ?
help


Сообщение отредактировал AlexsSyr - Среда, 10 Августа 2016, 23:35
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг