OpenGL: إنشاء الكاميرا الخاصة بي
سؤال
أحاول إنشاء كاميرا للتنقل حول مساحة ثلاثية الأبعاد وأواجه بعض المشكلات في إعدادها. أنا أفعل هذا هو جافا ، ويبدو أن استخدام Gluperseptive و Glulookat معًا يخلق صراعًا (تبدأ الشاشة في التلاشي مثل Mad).
تم تعيين اللمعان مثل هذا:
gl.glMatrixMode(GLMatrixFunc.GL_PROJECTION);
gl.glLoadIdentity();
glu.gluPerspective(50.0f, h, 1.0, 1000.0);
gl.glMatrixMode(GLMatrixFunc.GL_MODELVIEW);
أقوم بعد ذلك بإنشاء مصفوفة كاميرا ، واستفد من إحداثيات العين ، والمتجهات إلى الأمام والأعلى (http://people.freedesktop.org/~idr/glu3/form_4.png) (دعنا نفترض أن رمز الكاميرا صحيح.
أخيرًا ، قبل أن أرسم أي شيء لدي:
gl.glMatrixMode(GLMatrixFunc.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glMultMatrixf(camera.matrix);
ثم أدعو روتين الرسم (الذي يقوم ببعض الترجمة/الدوران بمفردهم عن طريق استدعاء glrotatef و gltranslatef).
بدون مكالمة إلى glmultmatrixf ، تعرض الكاميرا العناصر التي أحتاج إلى رؤيتها في وسط الشاشة كما ينبغي. مع glmulmatrixf ومع ذلك ، كل ما أحصل عليه هو شاشة سوداء. حاولت استخدام gloadmatrixf بدلاً من ذلك ولم ينجح ذلك أيضًا. أفعل شيئا خاطئا؟ هل أضع شيئًا في مكانه؟ إذا لم يكن الأمر كذلك ، وهذه هي الطريقة التي يجب أن يتم بها ، أخبرني وسأقوم بنشر بعض رمز الكاميرا الذي قد يخلق النزاعات.
تحرير: هنا هو رمز إنشاء مصفوفة الكاميرا:
private void createMatrix()
{
float[] f = new float[3]; //forward (centre-eye)
float[] s = new float[3]; //side (f x up)
float[] u = new float[3]; //'new up' (s x f)
for(int i=0;i<3;i++){
f[i] = centre[i]-eye[i];
}
f = Maths.normalize(f);
s = Maths.crossProduct(f,upVec);
u = Maths.crossProduct(s,f);
float[][] mtx = new float[4][4];
float[][] mtx2 = new float[4][4];
//initializing matrices to all 0s
for (int i = 0; i < mtx.length; i++) {
for (int j = 0; j < mtx[0].length; j++) {
mtx[i][j] = 0;
mtx2[i][j] = 0;
}
}
//mtx = [ [s] 0,[u] 0,[-f] 0, 0 0 0 1]
//mtx2 = [1 0 0 -eye(x), 0 1 0 -eye(y), 0 0 1 -eye(z), 0 0 0 1]
for(int i=0;i<3;i++){
mtx[0][i] = s[i];
mtx[1][i] = u[i];
mtx[2][i] = -f[i];
mtx2[i][3]=-eye[i];
mtx2[i][3]=-eye[i];
mtx2[i][3]=-eye[i];
}
mtx[3][3] = 1;
mtx2[0][0]=1;mtx2[1][1] = 1;mtx2[2][2] = 1;mtx2[3][3] = 1;
mtx = Maths.matrixMultiply(mtx,mtx2);
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
// this.mtx is a float[16] for glMultMatrixf
this.mtx[i*4+j] = mtx[i][j];
}
}
}
أنا أتنقل على الخطأ في مكان ما في هذا الكود ، إن لم يكن ، سألقي نظرة على وظائف الرياضيات الخاصة بي لمعرفة ما يحدث ..
EDIT2: على الرغم من أنني يجب أن أذكر أن المتجهات الأولية على الأقل (العين ، المركز ، لأعلى) صحيحة وتضع كاميرا teh حيث يجب أن تكون (مع Glulookat ولكن كان لها مشكلة في الخفقان).
المحلول 2
تم إصلاحه نوعًا ما. كانت المشكلة هي استخدام GlmultMatrix (Matrix [] ، int؟ ofset؟) ... لسبب ما إذا كنت فقط استخدم glmultmatrix (مصفوفة Floatbuffer) فهي تعمل بشكل جيد ..
هناك بعض المشكلات المتعلقة بالتحولات التي أقوم بها ، لكن يجب أن أكون قادرًا على التعامل مع هؤلاء ... شكرًا لك على مدخلاتك على الرغم من الرجال.
نصائح أخرى
قد يكون من الأسهل استخدام glrotatef و gltranslatef و glfrustum لإنشاء الكاميرا ، على الرغم من أن الرياضيات الخاصة بك تبدو جيدة بالنسبة لي (طالما تم تعريف UPVEC بالفعل). في معظم الرسومات ثلاثية الأبعاد التي قمت بها ، لم يكن لديك حقًا كائن محدد تريد تتبعه. مررت بتطبيقات مختلفة لكاميرا ثلاثية الأبعاد باستخدام Glulookat قبل أن استقرت أخيرًا على هذا.
إليكم كيف أميل إلى تحديد كاميراتي:
عندما أقوم بإنشاء الكاميرا أو تهيئتها ، قمت بإعداد مصفوفة الإسقاط باستخدام GLFRUSTUM. يمكنك استخدام glperspecive إذا كنت تفضل:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(left, right, down, up, near, far);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
بعد أن قمت بمسح المخازن المؤقتة للون والعمق لتمريرة عرض ، ثم أتصل
glLoadIdentity();
glRotated(orientation.x, 1.0, 0.0, 0.0);
glRotated(orientation.y, 0.0, 1.0, 0.0);
glRotated(orientation.z, 0.0, 0.0, 1.0);
glTranslatef(position.x, position.y, position.z);
لوضع وتوجيه الكاميرا. في البداية ، قمت بتعيين الموضع والتوجيه على حد سواء إلى {0} ، ثم إضافة أو طرح من الموضع عند الضغط على المفتاح ، وإضافة أو طرح من الاتجاه. x و eachtation.y عند نقل الماوس ... (أنا عمومًا لا لألا ' ر فوضى مع التوجيه.
هتافات.