मैं अपने ऐप के उपयोगकर्ता को स्क्रीन पर अपनी उंगली को खींचकर स्क्रीन के केंद्र में खींची गई 3 डी ऑब्जेक्ट को घुमाने देने की कोशिश कर रहा हूं। स्क्रीन पर एक क्षैतिज आंदोलन का अर्थ है एक निश्चित Y अक्ष के चारों ओर घूमना, और एक ऊर्ध्वाधर आंदोलन का मतलब X अक्ष के चारों ओर घूमना है। मुझे जो समस्या हो रही है, वह यह है कि अगर मैं सिर्फ एक धुरी के चारों ओर घूमने की अनुमति देता हूं, तो वस्तु ठीक घूमती है, लेकिन जैसे ही मैं दूसरी घुमाव देता हूं, वस्तु अपेक्षा के अनुरूप नहीं घूमती है।
यहाँ क्या हो रहा है की एक तस्वीर है:
नीला अक्ष मेरे निश्चित अक्ष का प्रतिनिधित्व करता है। इस निश्चित नीले अक्ष वाले चित्र को स्क्रीन करें। यही वह चीज है जिसके संबंध में मैं वस्तु को घुमाना चाहता हूं। जो हो रहा है वह लाल रंग में है।
यहाँ मुझे पता है:
- Y (0, 1, 0) के चारों ओर पहला घुमाव मॉडल को नीले स्थान से स्थानांतरित करने का कारण बनता है (इस स्थान को A) दूसरे स्थान पर कॉल करें (इस स्थान को B कहें)
- वेक्टर (1, 0, 0) का उपयोग करके फिर से घुमाने की कोशिश कर रहा है, स्पेस एक्स में चारों ओर घूमता है बी नॉट स्पेस ए में जो कि मेरे कहने का मतलब नहीं है।
यहाँ मैंने जो कोशिश की है, वह दी है जो मुझे लगता है कि मुझे पता है (संक्षिप्तता के लिए डब्ल्यू समन्वय छोड़कर):
- पहले एक चतुर्भुज का उपयोग करके Y (0, 1, 0) के चारों ओर घुमाएं।
- रोटेशन Y Quaternion को एक मैट्रिक्स में परिवर्तित करें।
- नई जगह के संबंध में एक्स अक्ष प्राप्त करने के लिए मेरे स्थिर अक्ष x वेक्टर (1, 0, 0) द्वारा वाई रोटेशन मैट्रिक्स को गुणा करें।
- एक चतुर्भुज का उपयोग करके इस नए एक्स वेक्टर के चारों ओर घुमाएं।
यहाँ कोड है:
private float[] rotationMatrix() {
final float[] xAxis = {1f, 0f, 0f, 1f};
final float[] yAxis = {0f, 1f, 0f, 1f};
float[] rotationY = Quaternion.fromAxisAngle(yAxis, -angleX).toMatrix();
// multiply x axis by rotationY to put it in object space
float[] xAxisObjectSpace = new float[4];
multiplyMV(xAxisObjectSpace, 0, rotationY, 0, xAxis, 0);
float[] rotationX = Quaternion.fromAxisAngle(xAxisObjectSpace, -angleY).toMatrix();
float[] rotationMatrix = new float[16];
multiplyMM(rotationMatrix, 0, rotationY, 0, rotationX, 0);
return rotationMatrix;
}
यह मेरी अपेक्षा के अनुरूप काम नहीं कर रहा है। रोटेशन काम करने लगता है, लेकिन कुछ बिंदु पर क्षैतिज गति Y अक्ष के बारे में नहीं घूमती है, यह Z अक्ष के बारे में घूमता प्रतीत होता है।
मुझे यकीन नहीं है कि अगर मेरी समझ गलत है, या अगर कुछ और समस्या पैदा कर रही है। मेरे पास कुछ अन्य परिवर्तन हैं जो मैं रोटेशन के अलावा ऑब्जेक्ट के लिए कर रहा हूं। मैं रोटेशन को लागू करने से पहले वस्तु को केंद्र में ले जाता हूं। मैं इसे अपने फ़ंक्शन से ऊपर दिए गए मैट्रिक्स का उपयोग करके घुमाता हूं, फिर मैं इसे Z दिशा में -2 अनुवाद करता हूं ताकि मैं ऑब्जेक्ट देख सकूं। मुझे नहीं लगता कि यह मेरे घुमावों को गड़बड़ कर रहा है, लेकिन यहाँ वैसे भी इसके लिए कोड है:
private float[] getMvpMatrix() {
// translates the object to where we can see it
final float[] translationMatrix = new float[16];
setIdentityM(translationMatrix, 0);
translateM(translationMatrix, 0, translationMatrix, 0, 0f, 0f, -2);
float[] rotationMatrix = rotationMatrix();
// centers the object
final float[] centeringMatrix = new float[16];
setIdentityM(centeringMatrix, 0);
float moveX = (extents.max[0] + extents.min[0]) / 2f;
float moveY = (extents.max[1] + extents.min[1]) / 2f;
float moveZ = (extents.max[2] + extents.min[2]) / 2f;
translateM(centeringMatrix, 0, //
-moveX, //
-moveY, //
-moveZ //
);
// apply the translations/rotations
final float[] modelMatrix = new float[16];
multiplyMM(modelMatrix, 0, translationMatrix, 0, rotationMatrix, 0);
multiplyMM(modelMatrix, 0, modelMatrix, 0, centeringMatrix, 0);
final float[] mvpMatrix = new float[16];
multiplyMM(mvpMatrix, 0, projectionMatrix, 0, modelMatrix, 0);
return mvpMatrix;
}
मैं कुछ दिनों के लिए इस पर अटक गया। मदद काफी सराहना की है।
================================================== ================
अपडेट करें:
एकता में काम करने के लिए यह सीधा है। यहाँ कुछ कोड है जो एक घन को मूल पर केंद्रित करता है:
public class CubeController : MonoBehaviour {
Vector3 xAxis = new Vector3 (1f, 0f, 0f);
Vector3 yAxis = new Vector3 (0f, 1f, 0f);
// Update is called once per frame
void FixedUpdate () {
float horizontal = Input.GetAxis ("Horizontal");
float vertical = Input.GetAxis ("Vertical");
transform.Rotate (xAxis, vertical, Space.World);
transform.Rotate (yAxis, -horizontal, Space.World);
}
}
जिस हिस्से से घुमाव आता है वह व्यवहार करता है जैसा कि मैं उम्मीद कर रहा हूं Space.World
कि Rotate
यह परिवर्तन पर फ़ंक्शन का पैरामीटर है ।
अगर मैं एकता का उपयोग कर सकता हूं, तो दुर्भाग्य से मुझे इस व्यवहार को खुद कोड करना होगा।