Войти
ПрограммированиеФорумГрафика

Как перевести 3 мерные координаты в пиксели на экране? (2 стр)

Страницы: 1 2 3 Следующая »
#15
23:52, 19 окт. 2009

Sergio666
> вообще супер очевидно - cot это ctg :)))
В крайнем случае (если не очевидно) можно было погуглить 2 секунды и найти эту страницу:
http://mathworld.wolfram.com/Cotangent.html


#16
1:18, 20 окт. 2009

X = X/Z
Y = Y/Z

#17
8:16, 20 окт. 2009

TormozzZ
Читай Ла Мота "Секреты программирования игр", у него были формулы и для ортогональной, и для перспективной проекции:
http://www.pmg.org.ru/gamedev/index.html

#18
8:40, 20 окт. 2009

бугогашечка=) помню как то сам формулы выводил, когда в паскале кодил, лет 10 назад, доступа к знаниям не было=)

можно взять справочник по инженерной математике, как в свое время это сделал я, оттуда узнать
projection

xScale     0          0               0
0        yScale       0               0
0          0       zf/(zf-zn)         1
0          0       -zn*zf/(zf-zn)     0
где:
yScale = cot(fovY/2)
xScale = yScale / aspect_ratio
aspect_ratio - соотношение сторон экрана (ширины к высоте)
zn - ближняя плоскость отсечения
zf - дальняя плоскость отсечения
fovy - поле зрения в радианах для y составляющей

view

zaxis = normal(At - Eye)
xaxis = normal(cross(Up, zaxis))
yaxis = cross(zaxis, xaxis)
    
 xaxis.x           yaxis.x           zaxis.x          0
 xaxis.y           yaxis.y           zaxis.y          0
 xaxis.z           yaxis.z           zaxis.z          0
-dot(xaxis, eye)  -dot(yaxis, eye)  -dot(zaxis, eye)  l
At - куда смотрим (вектор)
Eye - откуда смотрим (вектор)
Up - вектор направления верха, нужно для ориентации в пространстве

world строится из

матрицы масштаба:
s.x,             0.0f,            0.0f,            0.0f,
0.0f,            s.y,             0.0f,            0.0f,
0.0f,            0.0f,            s.z,             0.0f,
0.0f,            0.0f,            0.0f,           1.0f
s - коэффициенты масштабирования

матрицы перемещения(то где расположен объект):
1.0f,            0.0f,             0.0f,            0.0f,
0.0f,            1.0f,             0.0f,            0.0f,
0.0f,            0.0f,             1.0f,            0.0f,
T.x,             T.y,              T.z,             1.0f
T - вектор смещения

и матриц вращения (в книжке, которую я читал была дана так же объединенная формула, но найти её сейчас не могу )
1.0f,             0.0f,            0.0f,            0.0f,
0.0f,             cos(x),         sin(x),          0.0f,
0.0f,             -sin(x),        cos(x),         0.0f,
0.0f,             0.0f,            0.0f,            1.0f
x - угол вращения вокруг оси x

cos(y),          0.0f,            -sin(y),            0.0f,
0.0f,             1.0f,            0.0f,            0.0f,
sin(y),           0.0f,            cos(y),            0.0f,
0.0f,             0.0f,            0.0f,            1.0f
y - угол вращения вокруг оси y

cos(z),          sin(z),         0.0f,            0.0f,
-sin(z),         cos(z),         0.0f,            0.0f,
0.0f,             0.0f,            1.0f,            0.0f,
0.0f,             0.0f,            0.0f,            1.0f
z - угол вращения вокруг оси z
вся инфа есть в например в DX SDK
#19
8:56, 20 окт. 2009

полностью - с формулами, матрицами и числами - преобразования описаны, например, в OpenGL: Specification.

#20
8:59, 20 окт. 2009

например, в glspec21.pdf, - начиная со страницы 40.

#21
9:23, 20 окт. 2009

мда...

#22
9:45, 20 окт. 2009

Качай меса ГЛ

там буит

gl(u)project
gl(u)unproject

с сорцом

#23
14:15, 20 окт. 2009

Не стану создавать новую тему.

Как-то я запутался в отличиях OpenGL от DirectX. Распишу как я понимаю - исправьте если неправильно, пожалуйста.
DIRECTX
1. Использует правостороннюю систему координат. Повороты положительные - по часовой стрелке, если смотреть вдоль оси поворота.
2. Элементы в матрице считаются по принципу - сначала строки. В том же порядке они размещены в памяти.

        | 0  1  2  3  | 

        | 4  5  6  7  |
    M = | 8  9  10 11 |
        | 12 13 14 15 |

3. Индексация элементов в матрице тоже - сначала строки.
        | 00 01 02 03 |

    M = | 10 11 12 13 |
        | 20 21 22 23 |
        | 30 31 32 33 |

4. Матрица трансляции.
        | 1 0 0 0 |

    T = | 0 1 0 0 |
        | 0 0 1 0 |
        | X Y Z 1 |

5. Матрицы поворота.
Ось Z:          Ось Y:            Ось X:

|  c s 0 0 |  | 1  0 0 0 |  | c 0 -s 0 |
| -s c 0 0 |  | 0  c s 0 |  | 0 1  0 0 |
|  0 0 1 0 |  | 0 -s c 0 |  | s 0  c 0 |
|  0 0 0 1 |  | 0  0 0 0 |  | 0 0  0 0 |

Где c = cos a, s = sin a.
6. Порядок умножения матриц.
В порядке применения матрицы записываются слева - направо и также умножаются. Умножение "строка на столбец". Например - сначала перенос на матрицу:
        |  1  0  0 0 |

    T = |  0  1  0 0 |
        |  0  0  1 0 |
        | -X -Y -Z 1 |

, затем поворот на угол п/2-t  - матрица
    | sin t   cos t   0   0 |

    |-cos t  sin t  0  0 |
Rz= |  0        0    1  0 |
    |  0        0    0  1 |

  записываем так:
V = T*Rz
и получаем:
 s       c      0   0

-c      s      0  0
0      0      1  0
-xc+yc  -xc-ys –z  1

7. Применение матрицы к вектору. Вектор - строку умножаем на матрицу.

В опенГЛ по другому нумеруются элементы матрицы, другая система координат... (это мне пока не надо - расписывать не буду).

#24
8:21, 21 окт. 2009
vector2 WorldToScreen(const vector3 &Pos, const matrix44 &VP, bool &Back)
{
vector4 Pos4(Pos.x,Pos.y,Pos.z,1.f);
vector4 Proj4 = VP * Pos4;
Back = Proj4.z < 0.f;
return vector2(((Proj4.x / Proj4.w) + 1.0f) * 0.5f, (((-Proj4.y / Proj4.w) + 1.0f) * 0.5f));
}
#25
9:11, 21 окт. 2009

это что, такой модный флеш-моб - "а разберись-как в четырех мегах моего говнокода"?

что, уже готовую формулу прочитать сложнее, чем разбирать её из чужого исходника?

#26
9:41, 21 окт. 2009

Mega
Это Вы мне?

#27
9:46, 21 окт. 2009

http://www.opengl.org/sdk/docs/man/xhtml/glFrustum.xml
http://www.opengl.org/sdk/docs/man/xhtml/gluLookAt.xml
http://www.opengl.org/sdk/docs/man/xhtml/gluPerspective.xml
http://www.opengl.org/sdk/docs/man/xhtml/glTranslate.xml
http://www.opengl.org/sdk/docs/man/xhtml/glScale.xml
http://www.opengl.org/sdk/docs/man/xhtml/glRotate.xml
http://www.graphicon.ru/oldgr/grafor/gr_help/chapter_8_1_1.htm
http://www.rossprogrammproduct.com/translations/Matrix%20and%20Qu… ion%20FAQ.htm
http://www.mirgames.ru/articles/opengl/camera.html
http://www.enlight.ru/faq3d/content.htm

#28
9:58, 21 окт. 2009

TopSpace
> Mega
> Это Вы мне?

это я всем, кто тонны своих убер-сорцов выкладывает.

#29
20:58, 21 окт. 2009

Вот как я получаю позицию 3D точки в экранном пространстве:

// GetWorldToScreen() - это матрица проэкции умноженная на матрицу трансформацию модели
// GetWindowSize() - размеры окна

bool PointToScreen(const vec3& point, vec2& screen)
{
  // Берём матрицу
  mat4 worldToScreen = scenerenderer->GetWorldToScreen();
  bool behind = false;

  vec4 outMat;
  // Делаем из vec3 vec4, чтобы можно было перемножить ( у меня так))) )
  vec4 transpos(point,1.0f);

  // перемножаем нашу матрицу на позицию в 3D-пространстве
  outMat = worldToScreen*transpos;

  // Проверяем, не сзади нас ли 3D точка
  if(outMat.w < 0)
    behind = true;

  // Вычисляем поправку
  float zDiv = outMat.w == 0.0f ? 1.0f :
    (1.0f / outMat.w);

  // Устанавливаем позицию на экране
  screen.x = ((eng->GetWindowSize().x * outMat.x * zDiv) + eng->GetWindowSize().x) / 2;
  screen.y = ((eng->GetWindowSize().y - (eng->GetWindowSize().y * (outMat.y * zDiv)))) / 2;

  return behind;
}
Страницы: 1 2 3 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.