簡體   English   中英

Unity3D:使圓柱體從一個點延伸到另一個點

[英]Unity3D : make cylinder stretch from one point to another

我想在每個幀上移動,縮放和旋轉給定的圓柱,以使其表現得像兩點之間的“繩索”。

我現在有這段代碼,但它根本無法按預期工作:

hook.transform.position = (rightHandPosition + hookDestination)/2;

hook.transform.localScale = new Vector3(0.5F, Vector3.Magnitude(hookDestination - rightHandPosition), 0.5F);

hook.transform.rotation = Quaternion.Euler(hookDestination - rightHandPosition);

如您所料,這兩點分別是rightHandPosition和hookDestination。 目前,圓柱體在“隨機”位置生成,具有“隨機”旋轉和巨大的比例。

我該如何解決?

“完整”腳本:

public class FirstPersonController : MonoBehaviour {

    public GameObject hook;
    bool isHooked = false;
    Vector3 hookDestination;
    Vector3 rightHandPosition;

    void Start() {
        hook.renderer.enabled = false;
        rightHandPosition = hook.transform.position;
    }

    // Update is called once per frame
    void Update () {
        if (isHooked) {
            hook.transform.position = (rightHandPosition + hookDestination)/2;
            hook.transform.localScale = new Vector3(0.5F, Vector3.Magnitude(hookDestination - rightHandPosition), 0.5F);
            hook.transform.rotation = Quaternion.Euler(hookDestination - rightHandPosition);
        }

        if (isHooked && !Input.GetMouseButton(1)) {
            isHooked = false;
            hook.renderer.enabled = false;
        }

        if (Input.GetMouseButtonDown (1) && !isHooked) {
            Ray ray = GameObject.FindGameObjectWithTag ("MainCamera").camera.ViewportPointToRay (new Vector3 (0.5F, 0.5F, 0));
            RaycastHit hit;
            if (Physics.Raycast (ray, out hit) && hit.distance < 5000000 && hit.collider.tag != "Player") {
                isHooked = true;
                hookDestination = hit.point;
                hook.renderer.enabled = true;
            }
        }
    }
}

屏幕截圖:

鈎子行為(錯誤)

讓我們假設cubeStart是起點,而cubeEnd是終點。 而“氣瓶”就是你的氣瓶

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AlignCyl : MonoBehaviour {


    GameObject cubeStart;
    GameObject cubeEnd;
    GameObject cylinder;

    Vector3 endV; 
    Vector3 startV;
    Vector3 rotAxisV;
    Vector3 dirV;
    Vector3 cylDefaultOrientation = new Vector3(0,1,0);

    float dist;

    // Use this for initialization
    void Start () {

         cubeStart = GameObject.Find("CubeStart");
         cubeEnd   = GameObject.Find("CubeEnd");

         cylinder  = GameObject.Find("Cylinder");

        endV   = cubeEnd.transform.position;
        startV = cubeStart.transform.position;


    }

    // Update is called once per frame
    void Update () {

        // Position
        cylinder.transform.position = (endV + startV)/2.0F;

        // Rotation
        dirV = Vector3.Normalize(endV - startV);

        rotAxisV = dirV + cylDefaultOrientation;

        rotAxisV = Vector3.Normalize(rotAxisV);

        cylinder.transform.rotation = new Quaternion(rotAxisV.x, rotAxisV.y, rotAxisV.z, 0);

        // Scale        
        dist = Vector3.Distance(endV, startV);

        cylinder.transform.localScale = new Vector3(1, dist/2, 1);

    }
}

在Unity3D 2018.1中進行了測試。我關於旋轉的概念僅基於四元數。

x=rotAxis.x * sin(angle/2)  = rotAxis.x;
y=rotAxis.y * sin(angle/2) = rotAxis.y;
z=rotAxis.z * sin(angle/2) = rotAxis.z;
w = cos(angle/2) = 0;

其中rotAxis是2個向量的總和,即默認圓柱方向和所需方向。 角度為180度,因為我們希望圓柱體繞rotAxis旋轉180度。 它是四元數旋轉(繞軸旋轉)的定義。

fafase的評論是正確的答案:使用LineRenderer

hookRender.SetPosition(0, rightHandPosition);
hookRender.SetPosition(1, hookDestination);

暫無
暫無

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

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