2 rotasi dengan transform.Rotate() dan transform.localEulerAngles() tidak berfungsi

Saya mencoba membuat simulator mobil sederhana, dan ketika saya menggunakan transform.Rotate() untuk memutar kata pengantar roda (sumbu x), dan transform.localEulerAngles() untuk memutar ke arah belok (sumbu y), saja localEulerAngles() berfungsi. ketika saya hanya menggunakan satu metode, rotasi kata pengantar roda (sumbu x) berfungsi, tetapi saya tidak dapat membuat keduanya berfungsi. Apakah Anda punya ide bagaimana membuat keduanya bekerja sama?

float ro = 20f; // 20 degrees turn
//to preserve the x and z values of rotation
Vector3 rot = wheel.gameObject.transform.rotation.eulerAngles;
//rotates the wheels angle
wheel.gameObject.transform.localEulerAngles = new Vector3(rot.x, ro, rot.z);

float vel = wheel.rpm * 2 * Mathf.PI / 60 * Time.deltaTime * Mathf.Rad2Deg;
//rotates the wheels forward
wheel.gameObject.transform.Rotate(vel, 0, 0);

person hallelshohat    schedule 04.08.2019    source sumber


Jawaban (2)


Anda tidak boleh menggunakan localEulerAngles ketika Anda melakukan dua rotasi yang berbeda, karena ketika Anda memiliki 2 gerakan, jika Anda menggunakan localEulerAngles Anda mengubah sudut lokal dengan gerakan yang Anda sediakan sendiri sehingga Anda kehilangan referensi di mana posisi sudut sumbu Anda berada. pada. Anda dapat menunjukkan metode rotasi untuk memutar sehubungan dengan dunia, transform.rotate memutar transformasi objek Anda relatif terhadap dunia sehingga Anda dapat menangani rotasi simultan secara bersamaan karena sumbu dunia tidak berubah. Temukan di bawah cuplikan kode yang saya coba, dan gambar orientasi sumbu saya yang tidak sama persis dengan milik Anda.

public class WheelTurning : MonoBehaviour

{

float rpm=10f;
// Start is called before the first frame update
void Start()
{

}

// Update is called once per frame
void Update()
{
    if (Input.GetKeyDown(KeyCode.A))
    {
        turn(direction.left);
    }
    if (Input.GetKeyDown(KeyCode.D))
    {
        turn(direction.right);
    }
    float vel = this.rpm * 2 * Mathf.PI / 60 * Time.deltaTime * Mathf.Rad2Deg;
    rotate(vel);
}
enum direction
{
    left,
    right
}
void turn(direction dir)
{
    Vector3 rot = this.gameObject.transform.rotation.eulerAngles;
    //rotates the wheels angle
    float rotation = dir == direction.left ? 20f : -20f;
    gameObject.transform.Rotate(new Vector3(0, rotation, 0), Space.World);
}
void rotate (float speed)
{

    gameObject.transform.Rotate(0, speed, 0);
}

}

gambar referensi sumbu

Namun akan lebih efektif jika menggunakan angka empat, coba periksa. Semoga itu bisa membantu!

person rustyBucketBay    schedule 04.08.2019
comment
Mencoba yang ini tetapi masalahnya adalah saya memerlukan nilai absolut untuk arah belokan (untuk mengatur rotasi ke 20 dan tidak menambahkan 20), dan oleh karena itu ia mulai berputar. Tapi keduanya bekerja - person hallelshohat; 04.08.2019
comment
Saya tidak mengerti maksud Anda. Jika Anda ingin memutar roda, selalu perhatikan posisi putaran sebelumnya. Dengan referensi tersebut Anda dapat memilih nilai yang Anda suka pada vektor rotasi Vector3(0, rotasi, 0). Jika Anda menginginkan referensi absolut, Anda dapat membuat objek induk dan memutarnya. Objek memiliki poros dunia yang sama dan ketika diputar atau diubah, anak-anak mengalami transformasi yang sama. Anda harus memastikan bahwa posisi anak adalah 0,0,0 karena ini adalah jarak terhadap posisi induk yang akan menjadi poros rotasi. - person rustyBucketBay; 05.08.2019

Saya tidak mengerti maksud Anda. Jika Anda ingin memutar roda, selalu perhatikan posisi putaran sebelumnya. Dengan referensi tersebut Anda dapat memilih nilai yang Anda suka pada vektor rotasi Vector3(0, rotasi, 0). Jika Anda menginginkan referensi absolut, Anda dapat membuat objek induk dan memutarnya. Objek memiliki poros dunia yang sama dan ketika diputar atau diubah, anak-anak “menderita” transformasi yang sama. Anda harus memastikan bahwa posisi anak adalah 0,0,0 karena ini adalah jarak terhadap posisi induk yang akan menjadi poros rotasi.

 void setRotation()
{
    Vector3 rot = this.gameObject.transform.rotation.eulerAngles;
    GameObject wheelParent = gameObject.transform.parent.gameObject;
    Vector3 rotationVector = new Vector3(0, 30, 0);//absolute turn set
    Quaternion rotation = Quaternion.Euler(rotationVector);
    wheelParent.transform.localRotation = rotation;
}

Semoga itu bisa membantu.

person rustyBucketBay    schedule 05.08.2019