내 이해에서
gluLookAt(
eye_x, eye_y, eye_z,
center_x, center_y, center_z,
up_x, up_y, up_z
);
다음과 같습니다.
glRotatef(B, 0.0, 0.0, 1.0);
glRotatef(A, wx, wy, wz);
glTranslatef(-eye_x, -eye_y, -eye_z);
그러나 ModelView
행렬을 인쇄 할 때 호출이 glTranslatef()
제대로 작동하지 않는 것 같습니다. 다음은 코드 스 니펫입니다.
#include <stdlib.h>
#include <stdio.h>
#include <GL/glut.h>
#include <iomanip>
#include <iostream>
#include <string>
using namespace std;
static const int Rx = 0;
static const int Ry = 1;
static const int Rz = 2;
static const int Ux = 4;
static const int Uy = 5;
static const int Uz = 6;
static const int Ax = 8;
static const int Ay = 9;
static const int Az = 10;
static const int Tx = 12;
static const int Ty = 13;
static const int Tz = 14;
void init() {
glClearColor(0.0, 0.0, 0.0, 0.0);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
GLfloat lmodel_ambient[] = { 0.8, 0.0, 0.0, 0.0 };
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
}
void displayModelviewMatrix(float MV[16]) {
int SPACING = 12;
cout << left;
cout << "\tMODELVIEW MATRIX\n";
cout << "--------------------------------------------------" << endl;
cout << setw(SPACING) << "R" << setw(SPACING) << "U" << setw(SPACING) << "A" << setw(SPACING) << "T" << endl;
cout << "--------------------------------------------------" << endl;
cout << setw(SPACING) << MV[Rx] << setw(SPACING) << MV[Ux] << setw(SPACING) << MV[Ax] << setw(SPACING) << MV[Tx] << endl;
cout << setw(SPACING) << MV[Ry] << setw(SPACING) << MV[Uy] << setw(SPACING) << MV[Ay] << setw(SPACING) << MV[Ty] << endl;
cout << setw(SPACING) << MV[Rz] << setw(SPACING) << MV[Uz] << setw(SPACING) << MV[Az] << setw(SPACING) << MV[Tz] << endl;
cout << setw(SPACING) << MV[3] << setw(SPACING) << MV[7] << setw(SPACING) << MV[11] << setw(SPACING) << MV[15] << endl;
cout << "--------------------------------------------------" << endl;
cout << endl;
}
void reshape(int w, int h) {
float ratio = static_cast<float>(w)/h;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, ratio, 1.0, 425.0);
}
void draw() {
float m[16];
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glGetFloatv(GL_MODELVIEW_MATRIX, m);
gluLookAt(
300.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f
);
glColor3f(1.0, 0.0, 0.0);
glutSolidCube(100.0);
glGetFloatv(GL_MODELVIEW_MATRIX, m);
displayModelviewMatrix(m);
glutSwapBuffers();
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(400, 400);
glutInitWindowPosition(100, 100);
glutCreateWindow("Demo");
glutReshapeFunc(reshape);
glutDisplayFunc(draw);
init();
glutMainLoop();
return 0;
}
내가 사용 어떤 값을 아무리 eye
벡터 :
300, 0, 0
하거나
0, 300, 0
또는
0, 0, 300
변환 벡터는 코드의 순서가 너무 뒤로하기 때문에 이해가되지 않는, 동일 glTranslatef
다음, 먼저 2 회전을 실행해야합니다. 또한 회전 행렬은 ModelView 행렬의 변환 열과 완전히 독립적입니다. 그러면이 이상한 동작이 발생하는 원인은 무엇입니까? 여기에 눈 벡터가있는 출력이 있습니다.(0.0f, 300.0f, 0.0f)
MODELVIEW MATRIX
--------------------------------------------------
R U A T
--------------------------------------------------
0 0 0 0
0 0 0 0
0 1 0 -300
0 0 0 1
--------------------------------------------------
나는 T
열 이 기대 됩니다 (0, -300, 0)
! 그래서 누군가 내가 이것을 설명하도록 도울 수 있습니까?
http://www.mesa3d.orggluLookAt
에서 구현
void GLAPIENTRY
gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx,
GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy,
GLdouble upz)
{
float forward[3], side[3], up[3];
GLfloat m[4][4];
forward[0] = centerx - eyex;
forward[1] = centery - eyey;
forward[2] = centerz - eyez;
up[0] = upx;
up[1] = upy;
up[2] = upz;
normalize(forward);
/* Side = forward x up */
cross(forward, up, side);
normalize(side);
/* Recompute up as: up = side x forward */
cross(side, forward, up);
__gluMakeIdentityf(&m[0][0]);
m[0][0] = side[0];
m[1][0] = side[1];
m[2][0] = side[2];
m[0][1] = up[0];
m[1][1] = up[1];
m[2][1] = up[2];
m[0][2] = -forward[0];
m[1][2] = -forward[1];
m[2][2] = -forward[2];
glMultMatrixf(&m[0][0]);
glTranslated(-eyex, -eyey, -eyez);
}
답변
gluLookAt
카메라가 {0, 0, 0}
네거티브 z 축을 향하고 바라 보는 방식으로 세상을 회전시키고 번역합니다 . OpenGL에서 사용되는 카메라 설정입니다. 실제로 카메라는 절대 움직이지 않습니다. 혼란 스럽습니까? 네, 설명해 드리겠습니다 🙂
이 예제를 보자.
eye : {300, 0, 0}
lookat : { 0, 0, 0}
up : { 0, 1, 0}
MODELVIEW MATRIX
--------------------------------------------------
R U A T
--------------------------------------------------
0 0 -1 0
0 1 0 0
1 0 0 -300
0 0 0 1
--------------------------------------------------
먼저 행렬의 회전 부분 인 R
, U
및 을 분석해야합니다 A
. 오른쪽 벡터 ( R
)가 더 이상 x 축 {1, 0, 0}
이 아니라 z 축에있는 것을 볼 수 {0, 0, 1}
있습니다. 즉, y 축을 중심으로 90도 회전합니다. 눈 위치에서도 마찬가지입니다. {-300, 0, 0}
y 축을 중심으로 90도 회전 하면 {0, 0, -300}
vo 에서 끝납니다 .
그것은이다 -300
아닌 300
세계 300 개 단위의 거리를 카메라에서 여전히 반대 방향으로 이동되도록, 세계는 카메라를 이동하지 않기 때문에 {0, 0, 0}
. 그리고 다시, 그것은 위에서 언급 한 것처럼 OpenGL 카메라가 보이는 곳이기 때문에 음의 z 축으로 이동합니다.
참고 : 귀하의 예에는 이상이 있습니다. 눈 위치에서 시점까지의 정규화 된 벡터는 업 벡터와 동일하지 않아야합니다.
eye : {0, 300, 0}
lookat : {0, 0, 0}
up : {0, 1, 0}
normalize(eye - lookat): {0, 1, 0} -> the same as the up-vector
실제로 작동하지 않습니다. 예를 들어 다른 업 벡터를 선택해야합니다. {1, 0, 0}