簡體   English   中英

沿 y 軸旋轉四元數

[英]Rotate in the y axis Quaternion

我正在使用 function Quaternion.FromToRotation控制對象的旋轉。 但不幸的是,它在所有 3 個軸上旋轉。 有人可以幫助我,所以我只能在 y 軸上旋轉並且 x & z 不應該受到影響嗎?

private Quaternion currentRot;
private Vector3 startPos;
private bool offsetSet;

public GameObject Ball;

void Update()
{
        SetOffsets();
 
        Vector3 closestPoint = Vector3.Normalize(transform.position - Ball.transform.position);
        robot.transform.rotation = Quaternion.FromToRotation(startPos, closestPoint) * currentRot;
    
}

void SetOffsets()
    {
        if (offsetSet)
            return;
 
        startPos = Vector3.Normalize(transform.position - Ball.transform.position);
        currentRot = Ball.transform.rotation;
 
        offsetSet = true;
    }

需要一種不同的方法。 與其保持一個方向來指示您的起始偏移量,不如保持與球相關的特定方向與局部前鋒的有符號角度,圍繞局部向上旋轉。 該特定方向是球的方向, 投影在垂直於機器人向上的平面上,或者換句話說,“展平”,因此它不再局部高於或低於機器人。

private Quaternion startRot; // currentRot is a misleading name
private float startAngleOffset;
private bool offsetSet;

[SerializeField] GameObject Ball;

void SetOffsets()
{
    if (offsetSet)
        return;
 
    Vector3 thisToBall = Ball.transform.position - transform.position;
    Vector3 robotUp = robot.transform.up;
    Vector3 flattenedToBall = Vector3.ProjectOnPlane(thisToBall, robotUp);
    Vector3 startAngleOffset = Vector3.SignedAngle(flattenedToBall, 
            robot.transform.forward, robotUp);
        
    currentRot = Ball.transform.rotation;
 
    offsetSet = true;
}

然后,當需要設置旋轉時,對球的方向進行另一個投影,然后使用這個有符號的角度來找到向前的方向應該是 然后使用Quaternion.LookRotation相應地設置旋轉。

共:

private Quaternion startRot;
private float startAngleOffset;
private bool offsetSet;

[SerializeField] GameObject Ball;

void Update()
{
    SetOffsets();

    Vector3 robotUp = robot.transform.up;
    Vector3 flattenedToBall = GetFlattenedToBall();
    Vector3 robotForwardDir = Quaternion.AngleAxis(startAngleOffset, robotUp)
            * flattenedToBall;

    robot.transform.rotation = LookRotation(robotForwardDir, robotUp);
}


void SetOffsets()
{
    if (offsetSet)
        return;
 
    Vector3 flattenedToBall = GetFlattenedToBall();
    Vector3 startAngleOffset = Vector3.SignedAngle(flattenedToBall, 
            robot.transform.forward, robot.transform.up);
    
    currentRot = Ball.transform.rotation;
 
    offsetSet = true;
}

Vector3 GetFlattenedToBall()
{
    Vector3 thisToBall = Ball.transform.position - transform.position;
    Vector3 flattenedToBall = Vector3.ProjectOnPlane(thisToBall, robot.transform.up);
}

暫無
暫無

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

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