कैमरा को घुमाने के लिए Input.GetAxis ("माउस एक्स / वाई") का उपयोग कैसे करें?


13

मैं एक पहला व्यक्ति कैमरा बनाना चाहता हूं जो माउस के साथ घूमता है।

मैंने Input.GetAxis Scripting API पेज को देखा और एक नमूना कोड पाया, जिसे मैंने अपनी पोस्ट के नीचे शामिल किया है। इसे आज़माने पर, मुझे एहसास हुआ कि यद्यपि इसमें वही बुनियादी कार्यक्षमता है जिसकी मुझे उम्मीद थी कि यह होगा, यह कैमरा को xz विमान के समानांतर नहीं रखता है, खासकर जब हलकों में माउस को घुमाते हुए। थोड़ी देर बाद कैमरा एक विषम कोण पर होगा, और खिलाड़ी पूरी तरह से डिस्कनेक्ट हो जाएगा!

क्या इस कोड में कोई त्वरित सुधार है जो किसी भी तरह से कैमरा मूवमेंट को प्रतिबंधित कर देगा, या कैमरा को घुमाने का एक बेहतर तरीका है?

 using UnityEngine;
 using System.Collections;

     public class ExampleClass : MonoBehaviour {
         public float horizontalSpeed = 2.0F;
         public float verticalSpeed = 2.0F;
         void Update() {
             float h = horizontalSpeed * Input.GetAxis("Mouse X");
             float v = verticalSpeed * Input.GetAxis("Mouse Y");
             transform.Rotate(v, h, 0);
         }
     }

आप क्या महसूस कर रहे हैं जैसे कि जिम्बल लॉक। यह तब होता है जब आप रोटेशन के लिए यूलर एंगल का उपयोग कर रहे होते हैं। मुझे समाधान देने के लिए कुछ परीक्षण करने होंगे। मूल रूप से, आपको quaternions का उपयोग करने की आवश्यकता है। वे जिम्बल लॉक से पीड़ित नहीं हैं।
फ़ज़ी लॉजिक

मैं रोटेशन करने के लिए एक चतुर्भुज का उपयोग कैसे करूंगा? मैंने ट्रांसफॉर्मेशन की कोशिश की। क्रेटेशन = क्वैटनियन।स्लेरैप (-Input.GetAxis ("माउस एक्स"), Input.GetAxis ("माउस एक्स"), Time.deltaTime * freeLookTurnxSpeed); , लेकिन इसने मुझे त्रुटियाँ दीं।
पुनर्जन्मेशनोफस्टेक्सएक्सचेंज

ठीक है, मैंने एक परीक्षण किया। सौभाग्य से, यह जिम्बल लॉक नहीं है। मैं आपके लिए उत्तर के रूप में समाधान पोस्ट करूंगा।
फजी लॉजिक

जवाबों:


18

समस्या यह है कि आप स्वयं को ट्रैक करने और प्रत्येक अद्यतन को प्रतिस्थापित करने के बजाय मौजूदा रोटेशन को अपडेट कर रहे हैं।

जब आप रोटेशन को अपडेट करते हैं तो यह आपके नए रोटेशन को पुराने के साथ जोड़ देता है जिससे अप्रत्याशित व्यवहार होता है।

इसका उपाय यह है कि आप अपने संचित घुमाव पर नज़र रखें और अपने नए मूल्यों के साथ पूरी तरह से प्रत्येक अद्यतन के रोटेशन को रीसेट करें।

क्रेडिट के कारण जहां मुझे यह उत्तर मिला: एकता उत्तर: कैसे-टू-लॉक-या-सेट-द-कैमरा-जेड-रोटेशन-टू-जीरो

काम कोड:

using UnityEngine;
using System.Collections;

public class FirstPersonCam : MonoBehaviour {

    public float speedH = 2.0f;
    public float speedV = 2.0f;

    private float yaw = 0.0f;
    private float pitch = 0.0f;

    void Update () {
        yaw += speedH * Input.GetAxis("Mouse X");
        pitch -= speedV * Input.GetAxis("Mouse Y");

        transform.eulerAngles = new Vector3(pitch, yaw, 0.0f);
    }
}

मुख्य अंतर:

  • स्थानीय विधि चरों के बजाय वर्ग सदस्यों के रूप में yaw और पिच को संग्रहीत करें, ताकि आप संचित मूल्यों पर नज़र रख सकें।
  • प्रत्येक अद्यतन संचित करने के लिए + = और / या - = का उपयोग करें।
  • रोटेट के बजाय eulerAngles का उपयोग करें (रोटेशन अद्यतन प्रत्येक अद्यतन को अधिलेखित करने के लिए) (जो आपके पुराने पर नया रोटेशन लागू करता है)।

आपका स्वागत है। यदि यह समाधान मैंने पोस्ट किया है तो आपको जो मूल समस्या आ रही थी, उसे हल कर दिया है, आपको इसे उत्तर के रूप में स्वीकार करना चाहिए। यदि आप अपनी नई समस्या के बारे में सहायता प्राप्त करना चाहते हैं, तो आपको चीजों को सुव्यवस्थित रखने के लिए एक नया प्रश्न पोस्ट करना चाहिए और दूसरों के लिए आपकी मदद करने में सक्षम होने या आपके प्रश्न को खोजने में सक्षम होने की संभावना है यदि वे इसी तरह की समस्या रखते हैं। टिप्पणी क्षेत्र विस्तारित संवाद के लिए नहीं हैं। चीयर्स।
फ़ज़ी लॉजिक

0

क्या होगा अगर आप एक खाली गेमबजेक्ट के कैमरा बच्चे को बनाते हैं। फिर एक स्क्रिप्ट के साथ आप यूपी वेक्टर के सापेक्ष खाली गेमबजेक्ट रोटेशन का प्रबंधन करते हैं। (माउसएक्स) एक अन्य स्क्रिप्ट के साथ कैमरा गेमबजेक्ट के लिए जिसे आप राइट वेक्टर (माउस) के सापेक्ष रोटेशन का प्रबंधन करते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.