আমি আমার অ্যাপ্লিকেশনটির ব্যবহারকারীকে স্ক্রিনে তাদের আঙুলটি টেনে স্ক্রিনের মাঝে আঁকানো একটি 3 ডি অবজেক্টটি ঘোরানোর চেষ্টা করছি। স্ক্রিনে একটি অনুভূমিক চলন অর্থ একটি স্থির Y অক্ষের চারপাশে ঘূর্ণন এবং একটি উল্লম্ব আন্দোলন মানে এক্স অক্ষের চারপাশে ঘূর্ণন। আমার যে সমস্যাটি হচ্ছে তা হ'ল আমি যদি কেবলমাত্র একটি অক্ষের চারপাশে ঘোরানোর অনুমতি দিই তবে বস্তুটি সূক্ষ্মভাবে ঘোরে, তবে আমি দ্বিতীয় ঘূর্ণনটি প্রবর্তন করার সাথে সাথে প্রত্যাশা অনুযায়ী বস্তুটি ঘোরবে না।
এখানে যা ঘটছে তার একটি চিত্র:
নীল অক্ষগুলি আমার স্থির অক্ষকে উপস্থাপন করে। এই স্থির নীল অক্ষটিযুক্ত পর্দার চিত্র দিন। এটিই আমি চাই যা সম্পর্কিতটির সাথে সম্পর্কিত হোক। যা হচ্ছে তা লালচে।
আমি যা জানি তা এখানে:
- Y এর চারপাশে প্রথম ঘূর্ণন (0, 1, 0) মডেলটিকে নীল স্থান থেকে (এই স্পেস এটিকে কল করুন) অন্য একটি স্পেসে স্থানান্তরিত করে (এই স্পেস বিটিকে কল করুন)
- ভেক্টর (1, 0, 0) ব্যবহার করে আবার ঘোরানোর চেষ্টা করা হচ্ছে স্থান A তে নয় বরং স্থান B এ x অক্ষের চারদিকে ঘোরে।
আমি যা চেষ্টা করেছি তা এখানে দেওয়া হয়েছে (আমি মনে করি) যা আমি জানি (ব্রিভটির জন্য ডাব্লু কোর্ড ছেড়ে):
- কোয়ার্টারিয়ন ব্যবহার করে প্রথমে Y (0, 1, 0) এর চারদিকে ঘোরান।
- ঘূর্ণন Y কোয়ার্টেরিয়নকে একটি ম্যাট্রিক্সে রূপান্তর করুন।
- নতুন স্থানের সাথে এক্স অক্ষ পেতে আমার স্থির অক্ষ x ভেক্টর (1, 0, 0) দ্বারা Y রোটেশন ম্যাট্রিক্সকে গুণ করুন।
- কোয়ার্টারিয়ন ব্যবহার করে এই নতুন এক্স ভেক্টরকে ঘিরে।
কোডটি এখানে:
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 অক্ষের চারপাশে ঘোরে বলে মনে হচ্ছে।
আমি নিশ্চিত না যে আমার বোঝাপড়াটি ভুল কিনা, বা অন্য কোনও কিছু যদি সমস্যা সৃষ্টি করে। আমার কিছু অন্যান্য রূপান্তর রয়েছে যা আমি ঘূর্ণনের পাশাপাশি অবজেক্টটিতে করছি। আমি ঘূর্ণন প্রয়োগের আগে অবজেক্টটিকে কেন্দ্রে নিয়ে যাই। আমি উপরের আমার ফাংশন থেকে ফিরে আসা ম্যাট্রিক্সটি ব্যবহার করে এটি ঘোরান, তারপরে আমি এটিকে জেড দিকটিতে অনুবাদ করি যাতে আমি বস্তুটি দেখতে পারি। আমি মনে করি না যে এটি আমার ঘূর্ণনগুলিকে বিশৃঙ্খলা করছে, তবে যাইহোক এটির জন্য কোড এখানে:
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
।
আমি যদি ইউনিটি ব্যবহার করতে পারতাম তবে দুর্ভাগ্যক্রমে আমাকে নিজের আচরণটি কোড করে নিতে হবে।