पर एक कैमरा घुमाने वाला मैं एक ऐसा गेम बना रहा हूं जो पूरे मानचित्र का उपयोग अपने मानचित्र के लिए करता है। मैंने गोलाकार ग्रह using this technique को tessellated है, और अब कैमरा नियंत्रण में जोड़ रहा हूँ।एक पॉइंट
क्षेत्र आयाम 1 से -1 का है, इसलिए क्षेत्र पर प्रत्येक बिंदु एक सामान्यीकृत वेक्टर भी है। किसी भी समय, गोलाकार बनाने वाली हेक्सागोनल टाइल्स में से एक 'चयनित' टाइल है। खिलाड़ी डी-पैड का उपयोग करके पड़ोसी टाइल्स में चयन को स्थानांतरित कर सकता है। वे एनालॉग स्टिक
का उपयोग करके कैमरे को स्वतंत्र रूप से घुमा सकते हैं। मुझे चयनित टाइल और कैमरे के संबंध में दो चीजें करने की आवश्यकता है। सबसे पहले, मुझे चयन को कैमरे के नजदीकी टाइल पर स्विच करने में सक्षम होना चाहिए। दूसरा, मुझे हाइलाइट किए गए टाइल
पर कैमरा को केंद्र पर केंद्रित करने की आवश्यकता है, क्षेत्र मूल पर बैठता है, और कैमरा बिंदु (0,0,1) पर बैठता है। ग्राफिक्स इंजन केवल मुझे एक्स और वाई अक्ष के चारों ओर कैमरे को घुमाने की अनुमति देता है, इसलिए पहली समस्या को हल करने के लिए, मैं एक्स के चारों ओर बिंदु (0,0,1) घुमाने के लिए quaternions का उपयोग करता हूं और फिर y अक्ष को बिंदु खोजने के लिए उपयोग करता है 3 डी अंतरिक्ष जहां कैमरा है:
private Quaternion quat = new Quaternion(0,0,0,0);
private double[] output = new double[4];
private double[] cam = new double[3];
private double camX = 0;
private double camY = 0;
private double camZ = 1;
private double[] getCamPosition(){
quat.setAxisAngle(1, 0, 0, Math.toRadians(-graphicsEngine.getRotationX()));
quat.RotateVector(camX, camY, camZ, output);
cam[0] = output[0];
cam[1] = output[1];
cam[2] = output[2];
quat.setAxisAngle(0, 1, 0, Math.toRadians(-graphicsEngine.getRotationY()));
quat.RotateVector(cam[0], cam[1], cam[2], output);
cam[0] = output[0];
cam[1] = output[1];
cam[2] = output[2];
return cam;
}
मैं तो प्रत्येक टाइल के केन्द्रक और कैमरे की स्थिति के बीच की दूरी की तुलना करें और टाइल कि नए चयनित टाइल हो के सबसे करीब है ले लो।
हालांकि, दूसरी समस्या को हल करने के लिए, मैं रिवर्स करना चाहता हूं। मैं सेंट्रॉइड (जो पहले से ही एक सामान्यीकृत वेक्टर के रूप में है) लेना चाहता हूं, और एक्स के चारों ओर घूर्णन को ढूंढने के लिए कैमरे को
इस समय, मैं मैं कैमरे को वापस (0,0,1) पर घुमा रहा हूं, फिर एक्स अक्ष में वाई अक्ष (0,0,1) और सेंट्रॉइड के बीच वाई अक्ष प्राप्त कर रहा हूं और कैमरे को दूसरी बार घूमने के लिए इसका उपयोग कर रहा हूं:
private double[] outputArray = new double[2];
/**
* Cam is always (0,0,1)
*/
public void centreOnSelected(double camX, double camY, double camZ){
selectedTile.getCentroidAngles(outputArray);
outputArray[0] -= Math.atan2(camZ, camY);
outputArray[1] -= Math.atan2(camX, camZ);
// this determines if the centroid is pointing away from the camera
// I.e. is on the far side of the sphere to the camera point (0,0,1)
if(!selected.getCentroidDirectionY(camX, camZ)){
outputArray[0] = -Math.PI - outputArray[0];
}
graphicsEngine.rotateCam(Math.toDegrees(outputArray[0]), Math.toDegrees(outputArray[1]));
}
और selected
(टाइल वर्ग) में
void getCentroidAngles(double[] outputArray){
outputArray[0] = Math.atan2(centroidZ, centroidY);
outputArray[1] = Math.atan2(centroidX, centroidZ);
}
समस्या यह है काम नहीं करता है, (एक्स अक्ष हमेशा बाहर प्रतीत होता है), और मुझे पूरा यकीन है कि कोणों को प्राप्त करने और घूर्णन करने के गणित के साथ करना है
नोट: ग्राफिक्स इंजन पहले घूमता है एक्स अक्ष, तो चारों ओर Y:
gl.glRotatef(mRotateX, 1, 0, 0);
gl.glRotatef(mRotateY, 0, 1, 0);
centroids सभी सही स्थान पर हैं, और कैमरे निश्चित रूप से सही मात्रा में घूमता है, तो मुझे यकीन है कि समस्या ग्राफिक्स इंजन के साथ नहीं है हूँ। यह भी कैमरे के फिर से स्थिति वापस करने के लिए (0,0,1) मैं इस जाँच लिया है के रूप में नहीं है कार्यक्रम के माध्यम से कदम से
मैं भी समस्या को वर्णन करने के लिए एक वीडियो बनाया है काम करता है:
http://www.youtube.com/watch?v=Uvka7ifZMlE
यह मुझे कई दिनों तक परेशान कर रहा है, इसलिए इस तय करने में कोई मदद की बहुत सराहना की जाएगी!
धन्यवाद जेम्स
दिलचस्प, धन्यवाद! मैं चारों ओर व्हीलिंग के साथ समझता हूं, लेकिन मुझे कभी एहसास नहीं हुआ कि इसका नाम था (बहुत कम, जैसा कि बालों वाली बॉल प्रमेय के रूप में उल्लसित है)। यह व्हीलिंग व्यवहार कंप्यूटर गेम में असामान्य नहीं है जिसे मैंने खेला है, और शायद मेरा खेल खेलते समय केवल मामूली ग्राफिकल परेशानियों के रूप में कार्य करेगा। लगता है जैसे मुझे समय के लिए कैमरे को केंद्र में केंद्रित/घूर्णन करना होगा –