簡體   English   中英

Unity 3D如何旋轉對象,使其基於地平面正確定向?

[英]Unity 3D how to rotate an object so that its oriented correctly based on the ground plane?

我正在使用稱為Dreamteck樣條線的資源來創建路徑,我想做的是制作路徑,因此當我旋轉樣條線時,在這種情況下,游戲對象粉紅色立方體也會旋轉,因此它在路徑上是否正確定向它的倒置或側面像過山車。 由於某種原因,我只能在立方體停止旋轉以使其自身與路徑對齊之前將路徑旋轉大約90度。 吉夫

if (Input.GetKey(KeyCode.W))
    {
        vehicle.transform.Translate(0, 0, speed * Time.deltaTime);

    }
    if (Physics.Raycast(vehicle.transform.position, Vector3.down, out hit, 100))
    {
        Vector3 surfaceNormal = hit.normal; // Assign the normal of the surface to surfaceNormal
        Vector3 forwardRelativeToSurfaceNormal = Vector3.Cross(vehicle.transform.InverseTransformDirection(vehicle.transform.right), surfaceNormal);
        Quaternion targetRotation = Quaternion.LookRotation(forwardRelativeToSurfaceNormal, surfaceNormal); //check For target Rotation.
        vehicle.transform.rotation = Quaternion.Lerp(vehicle.transform.rotation, targetRotation, Time.deltaTime * 20); //Rotate Character accordingly.

    }

我發現這正是我想要實現的目標:

 void Update()
{
    /*Here we get user input to calculate the speed the ship will get*/
    if (Input.GetKey(KeyCode.W))
    {
        /*Increase our current speed only if it is not greater than fwd_max_speed*/
        current_speed += (current_speed >= fwd_max_speed) ? 0f : fwd_accel * Time.deltaTime;
    }
    else
    {
        if (current_speed > 0)
        {
            /*The ship will slow down by itself if we dont accelerate*/
            current_speed -= brake_speed * Time.deltaTime;
        }
        else
        {
            current_speed = 0f;
        }
    }

    /*We get the user input and modifiy the direction the ship will face towards*/
    yaw += turn_speed * Time.deltaTime * Input.GetAxis("Horizontal");
    /*We want to save our current transform.up vector so we can smoothly change it later*/
    prev_up = transform.up;
    /*Now we set all angles to zero except for the Y which corresponds to the Yaw*/
    transform.rotation = Quaternion.Euler(0, yaw, 0);

    RaycastHit hit;
    if (Physics.Raycast(transform.position, -prev_up, out hit))
    {
        Debug.DrawLine(transform.position, hit.point);

        /*Here are the meat and potatoes: first we calculate the new up vector for the ship using lerp so that it is smoothed*/
        Vector3 desired_up = Vector3.Lerp(prev_up, hit.normal, Time.deltaTime * pitch_smooth);
        /*Then we get the angle that we have to rotate in quaternion format*/
        Quaternion tilt = Quaternion.FromToRotation(transform.up, desired_up);
        /*Now we apply it to the ship with the quaternion product property*/
        transform.rotation = tilt * transform.rotation;

        /*Smoothly adjust our height*/
        smooth_y = Mathf.Lerp(smooth_y, hover_height - hit.distance, Time.deltaTime * height_smooth);
        transform.localPosition += prev_up * smooth_y;
    }

    /*Finally we move the ship forward according to the speed we calculated before*/
    transform.position += transform.forward * (current_speed * Time.deltaTime);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM