मैं एलडब्ल्यूजेजीएल का उपयोग कर ओपनजीएल 3 सीख रहा हूं। मैंने gluLookAt()
के बराबर लागू करने की कोशिश की है, और हालांकि यह काम करता है मैं कुछ हद तक उलझन में हूं।ओपनजीएल 3 (एलडब्ल्यूजेजीएल) लुकएट मैट्रिक्स भ्रम
मैं इस कोड को वेब पर विभिन्न स्रोतों से कॉपी करने के लिए कबूल करता हूं, लेकिन बहुत से अध्ययन के बाद मुझे लगता है कि इसके पीछे गणित को समझते हैं, और मैं समझता हूं कि एलडब्ल्यूजेजीएल क्या कर रहा है।
हालांकि 'सही' gluLookAt
कोड मेरे आवेदन में गलत तरीके से व्यवहार किया गया था, क्योंकि कैमरा गलत तरीके से बदल रहा था। मैं केवल orthonormal वैक्टर forward
, side
, और up
transposing द्वारा काम कर मेरी कोड पाने में कामयाब रहे (आशा है कि मैं सही शब्दावली का उपयोग कर रहा हूँ!) है, जो मैं कर रहा हूँ यकीन है कि गलत है ...
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;
}
मैं मुझे नहीं लगता कि मुझे ट्रांसपोज़ करना चाहिए, लेकिन यह इसके बिना काम नहीं करता है। मैंने transpose()
लगाया क्योंकि मुझे सभी मैट्रिक्स सेल स्थितियों को पुनः टाइप करने के लिए परेशान नहीं किया जा सका!
मेरे समझ के साथ कि lookAt मैट्रिक्स के रूप के रूप में
[ 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 ]
इस प्रकार है और मुझे लगता है कि LWJGL Matrix4f
वर्ग m<col><row>
के रूप में मैट्रिक्स कोशिकाओं का प्रतिनिधित्व करता है होना चाहिए। translate(Vector3f)
विधि निम्नलिखित
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;
...
}
तो मैं बेहद उलझन में छोड़ दिया हूँ के रूप में करने के लिए इस का क्या हिस्सा मैं बँधा हुआ है नहीं करता है। क्या यह देखने की मेरी समझ है मैट्रिक्स, कॉलम/पंक्ति प्रमुख-नेस (क्या वह शब्द है ?!) Matrix4f
, या कुछ और? क्या मेरा बाकी कोड अभी टूट गया है? क्या यह वास्तव में सही है और मैं बस बहुत ज्यादा चिंता कर रहा हूं? क्या मैं सिर्फ मूर्ख हूँ?
धन्यवाद।
जवाब के लिए धन्यवाद की तरह काम करता है। जानना अच्छा लगा कि मैं बहुत दूर नहीं हूं। विधि Mat4.set (, , ) है? –
Zutty
बिल्कुल, मैं github पर पूरी lib की खोज करने की सलाह दूंगा। मुझे परियोजना का नाम याद नहीं है लेकिन यह एलडब्ल्यूजेजीएल ट्यूटोरियल है। –
ग्रेट, बहुत बहुत धन्यवाद। – Zutty