Хм, проблема решилась, но как-то сама по себе. Посмотрел на последовалетьность функций OpenGl glMatrixMode(GL_MODELVIEV), glLoadIdentity(), и LootAt() и до меня дошло, что нужно сначало загружать еденичную матрицу, а потом уже устанавливать камеру. Нужно било всего то написать свою функцию LoadIdentity(). Матрица CT ведь единтвенная в конвеере OpenGl. + нужно било изменить функцию LookAt, ниже приводиться рабочий вариант.
| Код | void LookAt(TVector3D eye, TVector3D look, TVector3D up) { TVector3D n, u, v; Diff(eye, look, n); VectMult(up, n, u); Normalize(&n); Normalize(&u); VectMult(n, u, v);
float ct[3][4];
ct[0][0] = u.x * CT[0][0] + u.y * CT[1][0] + u.z * CT[2][0]; ct[0][1] = u.x * CT[0][1] + u.y * CT[1][1] + u.z * CT[2][1]; ct[0][2] = u.x * CT[0][2] + u.y * CT[1][2] + u.z * CT[2][2]; ct[0][3] = u.x * CT[0][3] + u.y * CT[1][3] + u.z * CT[2][3] - Mult(eye, u);
ct[1][0] = v.x * CT[0][0] + v.y * CT[1][0] + v.z * CT[2][0]; ct[1][1] = v.x * CT[0][1] + v.y * CT[1][1] + v.z * CT[2][1]; ct[1][2] = v.x * CT[0][2] + v.y * CT[1][2] + v.z * CT[2][2]; ct[1][3] = v.x * CT[0][3] + v.y * CT[1][3] + v.z * CT[2][3] - Mult(eye, v);
ct[2][0] = n.x * CT[0][0] + n.y * CT[1][0] + n.z * CT[2][0]; ct[2][1] = n.x * CT[0][1] + n.y * CT[1][1] + n.z * CT[2][1]; ct[2][2] = n.x * CT[0][2] + n.y * CT[1][2] + n.z * CT[2][2]; ct[2][3] = n.x * CT[0][3] + n.y * CT[1][3] + n.z * CT[2][3] - Mult(eye, n);
CopyMemory(CT, &ct[0][0], sizeof(ct)); }
|
|