ক্যামেরাটি ঘোরানোর জন্য কীভাবে ইনপুট.গেটএক্সিস ("মাউস এক্স / ওয়াই") ব্যবহার করবেন?


13

আমি প্রথম ব্যক্তির ক্যামেরা তৈরি করতে চাই যা মাউসের সাহায্যে ঘোরে।

আমি ইনপুট.গেটএক্সিস স্ক্রিপ্টিং এপিআই পৃষ্ঠাটি দেখেছি এবং একটি নমুনা কোড পেয়েছি, যা আমি আমার পোস্টের নীচে অন্তর্ভুক্ত করেছি। এটি চেষ্টা করার পরে, আমি বুঝতে পেরেছিলাম যে এটির মতো একই বেসিক কার্যকারিতাটি রয়েছে যদিও আমি আশা করি এটিটি হবে তবে এটি ক্যামেরাটি এক্স জেন বিমানের সমান্তরাল রাখে না, বিশেষত যখন বৃত্তগুলিতে মাউসটি সরিয়ে দেয়। কিছুক্ষণ পরে ক্যামেরাটি একটি বিজোড় কোণে থাকবে এবং প্লেয়ারটি সম্পূর্ণ বিচ্ছিন্ন হয়ে যাবে!

এই কোডটিতে কি এমন কোনও দ্রুত সমাধান রয়েছে যা ক্যামেরার চলাচলকে একরকমভাবে সীমাবদ্ধ করবে বা ক্যামেরাটি ঘোরানোর জন্য আরও ভাল উপায় আছে?

 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);
         }
     }

আপনি যা অনুভব করছেন তা গিম্বল লকের মতো শোনাচ্ছে। আপনি যখন আবর্তনের জন্য ইউলার কোণ ব্যবহার করছেন তখন এটি ঘটে। সমাধান প্রস্তাব দেওয়ার জন্য আমাকে কিছু পরীক্ষা করতে হবে। মূলত, আপনি quaternion ব্যবহার করা প্রয়োজন। তারা গিম্বল লক থেকে ভোগেন না।
অস্পষ্ট যুক্তি

ঘূর্ণন করতে আমি কীভাবে একটি চৌকোণ ব্যবহার করব? আমি ট্রান্সফর্ম.রোটেশন = কোয়ার্টেরিয়ন.স্লার্প (-আইনপুট.গেটএক্সিস ("মাউস এক্স"), ইনপুট.গেটঅ্যাক্সিস ("মাউস এক্স"), টাইম.ডেলটাটাইম * ফ্রিলুকটর্নিংস্পিড) চেষ্টা করেছি; , কিন্তু এটি আমাকে ত্রুটি দিয়েছে।
পুনর্জন্ম অফস্ট্যাকেক্সচেঞ্জ

ঠিক আছে, আমি একটি পরীক্ষা করেছি। ভাগ্যক্রমে, এটি জিম্বল লক নয়। আমি উত্তরটি আপনার উত্তর হিসাবে পোস্ট করব।
অস্পষ্ট যুক্তি

উত্তর:


18

সমস্যাটি হ'ল আপনি বিদ্যমান রোটেশনটি নিজে অনুসন্ধান করার পরিবর্তে এবং প্রতিটি আপডেট প্রতিস্থাপনের পরিবর্তে আপডেট করছেন।

আপনি যখন ঘূর্ণনটি আপডেট করেন এটি আপনার নতুন ঘূর্ণনটিকে পুরানোটির সাথে সংযুক্ত করে যা অপ্রত্যাশিত আচরণের দিকে পরিচালিত করে।

সমাধানটি হ'ল আপনার জমে থাকা ঘূর্ণনের ট্র্যাক রাখা এবং প্রতিটি আপডেটকে আপনার নতুন মানগুলির সাথে পুরোপুরি পুনরায় সেট করা।

ক্রেডিট যেখানে বকেয়া আছে, আমি এখানে উত্তর পেয়েছি: ityক্য উত্তর: কীভাবে লক-বা-সেট-ক্যামেরা-জেড-রোটেশন-থেকে-শূন্য

কাজের কোড:

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);
    }
}

মূল পার্থক্য:

  • ইয়াউ এবং পিচকে স্থানীয় পদ্ধতি ভেরিয়েবলের পরিবর্তে শ্রেণীর সদস্য হিসাবে সংরক্ষণ করুন যাতে আপনি সঞ্চিত মানগুলি ট্র্যাক করতে পারেন।
  • প্রতিটি আপডেট সংগ্রহ করতে + = এবং / অথবা - = ব্যবহার করুন।
  • রোটেটের পরিবর্তে (যা আপনার নতুন ঘূর্ণনটি পুরানোটির উপরে প্রযোজ্য) পরিবর্তে ইউলারআঙ্গেলগুলি (প্রতিটি আপডেটের আবর্তন মানকে ওভাররাইট করতে) ব্যবহার করুন।

আপনার স্বাগত। যদি আমি পোস্ট করা এই সমাধানটি আপনার আসল সমস্যাটি সমাধান করে তবে আপনার এটি উত্তর হিসাবে গ্রহণ করা উচিত। আপনি যদি আপনার নতুন সমস্যার সাথে সহায়তা পেতে চান তবে আপনার বিষয়গুলিকে পরিপাটি করে রাখতে আরও একটি নতুন প্রশ্ন পোস্ট করা উচিত এবং অন্যরা যাতে আপনাকে একইভাবে সমস্যা করতে থাকে তবে আপনাকে সহায়তা করতে পারে বা আপনার প্রশ্ন সন্ধান করতে পারে। মন্তব্য ক্ষেত্রগুলি বর্ধিত কথোপকথনের জন্য নয়। চিয়ার্স।
অস্পষ্ট যুক্তি

0

আপনি যদি খালি গেমোবজেক্টের ক্যামেরা চাইল্ড তৈরি করেন। তারপরে একটি স্ক্রিপ্টের সাহায্যে আপনি ইউপি ভেক্টরের তুলনায় খালি গেমোবজেক্ট রোটেশন পরিচালনা করবেন ((মাউসএক্স) অন্য স্ক্রিপ্টের সাহায্যে ক্যামেরা গেমোবজেক্টের সাথে সংযুক্ত হয়ে আপনি ডান ভেক্টরের (মাউসওয়াই) সম্পর্কিত রোটেশন পরিচালনা করেন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.