2013-02-14 26 views
5

Ben lwjgl kullanarak OpenGL 3 öğreniyorum. Ben gluLookAt() için bir eşdeğer uygulamak için çalıştım, ve çalışmasına rağmen biraz neden karıştı mıyım. OpenGL 3 (lwjgl) raporuna bakın Matrix Karışıklık

Sadece web üzerinde çeşitli kaynaklardan bu kodu kopyalayarak itiraf, ama çok çalışma sonrası bence bunun arkasında matematik anlamak ve ben lwjgl ne yaptığını anlıyorum. Kamera yanlış yöne çevirerek gibiydi olarak

Ancak 'doğru' gluLookAt kodu, benim uygulamada yanlış davrandım. Sadece ortonormal vektörler forward, side ve up transpozlarını çalışan kodumu başardı (Doğru terminolojiyi kullanıyorum umut!), Ben oldukça emin yanlıştır değilim ki ...

private static final Vector3f forward = new Vector3f(); 
private static final Vector3f side = new Vector3f(); 
private static final Vector3f up = new Vector3f(); 
private static final Vector3f eye = new Vector3f(); 

public static Matrix4f lookAt(float eyeX, float eyeY, float eyeZ, 
           float centerX, float centerY, float centerZ, 
           float upX, float upY, float upZ) { 
    forward.set(centerX - eyeX, centerY - eyeY, centerZ - eyeZ); 
    forward.normalise(); 

    up.set(upX, upY, upZ); 

    Vector3f.cross(forward, up, side); 
    side.normalise(); 

    Vector3f.cross(side, forward, up); 
    up.normalise(); 

    Matrix4f matrix = new Matrix4f(); 
    matrix.m00 = side.x; 
    matrix.m01 = side.y; 
    matrix.m02 = side.z; 

    matrix.m10 = up.x; 
    matrix.m11 = up.y; 
    matrix.m12 = up.z; 

    matrix.m20 = -forward.x; 
    matrix.m21 = -forward.y; 
    matrix.m22 = -forward.z; 

    matrix.transpose(); // <------ My dumb hack 

    eye.set(-eyeX, -eyeY, -eyeZ); 
    matrix.translate(eye); 

    return matrix; 
} 

I Aktarımı yapmam gerektiğini düşünmüyorum, ama onsuz çalışmıyor. Ben transpose() koydum çünkü tüm matris hücre pozisyonları btw yeniden yazmak için rahatsız olamazdı!

Benim anlayış

[ side.x up.x fwd.x 0 ] [ 1 0 0 -eye.x ] 
[ side.y up.y fwd.y 0 ] [ 0 1 0 -eye.y ] 
[ side.z up.z fwd.z 0 ] [ 0 0 1 -eye.z ] 
[  0  0  0 1 ] [ 0 0 0  1 ] 

aşağıdaki Ve lwjgl Matrix4f sınıf m<col><row> olarak matris hücrelerini temsil ettiğini düşünüyorum raporuna bakın matris formu olmasıdır. translate(Vector3f) yöntem bu neresini ben mahvettiniz olarak aşağıdaki

public static Matrix4f translate(Vector3f vec, Matrix4f src, Matrix4f dest) { 
    ... 
    dest.m30 += src.m00 * vec.x + src.m10 * vec.y + src.m20 * vec.z; 
    dest.m31 += src.m01 * vec.x + src.m11 * vec.y + src.m21 * vec.z; 
    dest.m32 += src.m02 * vec.x + src.m12 * vec.y + src.m22 * vec.z; 
    dest.m33 += src.m03 * vec.x + src.m13 * vec.y + src.m23 * vec.z; 
    ... 
} 

Yani derece karışık kaldım yapar. o raporuna bakın matris benim anlayış mı, sütun/satır majör-lık (bir kelime ?! olduğunu) Matrix4f, yoksa başka bir şey? Kodumun kalan kısmı kırıldı mı? Gerçekten doğru mu ve sadece endişeleniyorum? Ben sadece salak mıyım?

Teşekkürler.

cevap

10

Hiçbir şey vermemelisiniz. LookAt() matrisinin "göz" vektörünü ve görünüm yönünü reddetmelisiniz. "EYE", her zaman ters çevrilmesi gereken kamera konumuna karşılık gelir. Bu, lookAt()

içinde yapılır. İşte

famous GLM math lib Java limanından raporuna bakın() yöntemidir.

public static Mat4 lookAt(Vec3 eye, Vec3 center, Vec3 up) { 

    Vec3 f = normalize(Vec3.sub(center, eye)); 
    Vec3 u = normalize(up); 
    Vec3 s = normalize(cross(f, u)); 
    u = cross(s, f); 

    Mat4 result = new Mat4(1.0f); 
    result.set(0, 0, s.x); 
    result.set(1, 0, s.y); 
    result.set(2, 0, s.z); 
    result.set(0, 1, u.x); 
    result.set(1, 1, u.y); 
    result.set(2, 1, u.z); 
    result.set(0, 2, -f.x); 
    result.set(1, 2, -f.y); 
    result.set(2, 2, -f.z); 

    return translate(result, new Vec3(-eye.x,-eye.y,-eye.z)); 
} 

benim lwjgl tabanlı OpenGL 4 oluşturucuyla kullanmak ve bir cazibe :) cevap için

+0

teşekkür gibi çalışır. Çok uzakta olduğumu bilmek güzel. yöntem Mat4.set (, , ) var mı? – Zutty

+0

Tam olarak, github üzerinde tüm lib aramak için tavsiye ederim. Projenin adını hatırlamıyorum ama LWJGL eğiticileri. –

+0

Harika, çok teşekkürler. – Zutty