2016-05-17 2 views
0

Я изучаю 3D OpenGL.OpenGL Java 3D Cube Rotation

Я смотрю видео thebennybox для обучения. , но теперь я совершенно смущен.

Мой куб, по-видимому, имеет три стороны только по сравнению с его учебным видео.

Я пробовал в течение нескольких дней, но все еще не могу понять, почему?

benny's tutorial video Start watching at 19:37

mine program execution 1

Mine Куб, кажется, имеют меньше сторон.

Мне интересно, окрашены ли стороны.

вращения Код:

public Matrix4f initRotation(float x, float y, float z) 
{ 
    Matrix4f rx = new Matrix4f(); 
    Matrix4f ry = new Matrix4f(); 
    Matrix4f rz = new Matrix4f(); 

    x = (float)Math.toRadians(x); 
    y = (float)Math.toRadians(y); 
    z = (float)Math.toRadians(z); 

    rz.m[0][0] = (float)Math.cos(z);rz.m[0][1] = -(float)Math.sin(z);rz.m[0][2] = 0;    rz.m[0][3] = 0; 
    rz.m[1][0] = (float)Math.sin(z);rz.m[1][1] = (float)Math.cos(z);rz.m[1][2] = 0;     rz.m[1][3] = 0; 
    rz.m[2][0] = 0;     rz.m[2][1] = 0;     rz.m[2][2] = 1;     rz.m[2][3] = 0; 
    rz.m[3][0] = 0;     rz.m[3][1] = 0;     rz.m[3][2] = 0;     rz.m[3][3] = 1; 

    rx.m[0][0] = 1;     rx.m[0][1] = 0;     rx.m[0][2] = 0;     rx.m[0][3] = 0; 
    rx.m[1][0] = 0;     rx.m[1][1] = (float)Math.cos(x);rx.m[1][2] = -(float)Math.sin(x);rx.m[1][3] = 0; 
    rx.m[2][0] = 0;     rx.m[2][1] = (float)Math.sin(x);rx.m[2][2] = (float)Math.cos(x);rx.m[2][3] = 0; 
    rx.m[3][0] = 0;     rx.m[3][1] = 0;     rx.m[3][2] = 0;     rx.m[3][3] = 1; 

    ry.m[0][0] = (float)Math.cos(y);ry.m[0][1] = 0;     ry.m[0][2] = -(float)Math.sin(y);ry.m[0][3] = 0; 
    ry.m[1][0] = 0;     ry.m[1][1] = 1;     ry.m[1][2] = 0;     ry.m[1][3] = 0; 
    ry.m[2][0] = (float)Math.sin(y);ry.m[2][1] = 0;     ry.m[2][2] = (float)Math.cos(y);ry.m[2][3] = 0; 
    ry.m[3][0] = 0;     ry.m[3][1] = 0;     ry.m[3][2] = 0;     ry.m[3][3] = 1; 

    m = rz.mul(ry.mul(rx)).getM(); 

    return this; 
} 

И импорт box.obj:

o cube 
v 1.000000 -1.000000 -1.000000 
v 1.000000 -1.000000 1.000000 
v -1.000000 -1.000000 1.000000 
v -1.000000 -1.000000 -1.000000 
v 1.000000 1.000000 -0.999999 
v 0.999999 1.000000 1.000001 
v -1.000000 1.000000 1.000000 
v -1.000000 1.000000 -1.000000 
usemtl Material 
s off 
f 1 2 3 
f 1 3 4 
f 5 8 7 
f 5 7 6 
f 1 5 6 
f 1 6 2 
f 2 6 7 
f 2 7 3 
f 3 7 8 
f 3 8 4 
f 5 1 4 
f 5 4 8 
+0

Похоже, что у вас нет установленной матрицы просмотра/проекции, что вы только вращаете куб, но вы не правильно позиционируете куб или камеру. –

+0

Я думаю, что моя мысль правильная ....... У меня действительно нет сторон куба после добавления проекции. Но я до сих пор не могу понять, почему. Мое новое видео [Cube less sides] (https://www.youtube.com/watch?v=nIqgTVD-zuk) – Kenny

ответ

0

В видео вы можете увидеть, что некоторые лица перепутаны (вы можете увидеть их только с внутренней стороны куб). Это означает, что где-то в вашем коде порядок индексов лица равен по часовой стрелке, а не против часовой стрелки (или наоборот). По умолчанию OpenGL показывает только одну сторону лица, метод под названием «отбрасывание лица».

Попробуйте использовать другую модель .obj с кубом, например, приведенную ниже. Если это не помогает, вам нужно пройти весь код, обрабатывающий файл .obj и в конечном итоге отобразить его с помощью OpenGL.

o cube 
v 0.0 0.0 0.0 
v 0.0 0.0 -1.0 
v 0.0 -1.0 0.0 
v 0.0 -1.0 -1.0 
v -1.0 0.0 0.0 
v -1.0 0.0 -1.0 
v -1.0 -1.0 0.0 
v -1.0 -1.0 -1.0 
usemtl Material 
s off 
f 1 7 5 
f 1 3 7 
f 1 4 3 
f 1 2 4 
f 3 8 7 
f 3 4 8 
f 5 7 8 
f 5 8 6 
f 1 5 6 
f 1 6 2 
f 2 6 8 
f 2 8 4 
+0

Извините ... Я был занят в эти дни. Я искал Learn OpenGL, поэтому знаю, что вы имеете в виду по часовой стрелке и против часовой стрелки. Но я не понимаю, сбрасывая обратные лица в блендере. – Kenny

+0

@ Kenny Я отредактировал свой ответ с новым предложением. – Fons

+0

Вы имеете в виду, что я должен попробовать эту модель и игнорировать вектор нормальный и 1 // 2 становится 2 7 // 2 становится 14? – Kenny