四元数 LookRotation

Posted

技术标签:

【中文标题】四元数 LookRotation【英文标题】:Quaternion LookRotation 【发布时间】:2022-01-18 22:12:06 【问题描述】:

我正在尝试关注一些关于塔防风格游戏的 c# 脚本的 unity3d 示例。我需要一个炮塔来“瞄准”另一个游戏对象。我发现的示例似乎没有说明不在 0,0,0 的原点。意思是,当炮塔在不同的位置时,它的目标是基于一个起点,而不是它的当前位置。

它现在的表现如何: http://screencast.com/t/Vx35LJXRKNUm

在我正在使用的脚本中,如何提供有关炮塔当前位置的 Quaternion.LookRotation 信息,以便将其包含在计算中?脚本,函数CalculateAimPosition,第59行:

using UnityEngine;
using System.Collections;

public class TurretBehavior : MonoBehaviour 

public GameObject projectile;
public GameObject muzzleEffect;

public float reloadTime = 1f;
public float turnSpeed = 5f;
public float firePauseTime = .25f;

public Transform target;
public Transform[] muzzlePositions;
public Transform turretBall;

private float nextFireTime;
private float nextMoveTime;
private Quaternion desiredRotation;
private Vector3 aimPoint;

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

    if (target) 
    
        if (Time.time >= nextMoveTime) 
        
            CalculateAimPosition(target.position);
            transform.rotation = Quaternion.Lerp(turretBall.rotation, desiredRotation, Time.deltaTime * turnSpeed);     
           

        if (Time.time >= nextFireTime) 
            FireProjectile();
        
    


void OnTriggerEnter(Collider other)

    if (other.gameObject.tag == "TurretEnemy") 
    
        nextFireTime = Time.time +(reloadTime *.5f);
        target = other.gameObject.transform;
            



void OnTriggerExit(Collider other)

    if (other.gameObject.transform == target) 
        target = null;
            


void CalculateAimPosition(Vector3 targetPosition)

    aimPoint = new Vector3 (targetPosition.x, targetPosition.y, targetPosition.z);
    desiredRotation = Quaternion.LookRotation (aimPoint);


void FireProjectile()

    nextFireTime = Time.time + reloadTime;
    nextMoveTime = Time.time + firePauseTime;

    foreach(Transform transform in muzzlePositions)
    
        Instantiate(projectile, transform.position, transform.rotation);
    


【问题讨论】:

【参考方案1】:

错误在于Quaternion.LookRotation的使用。

该函数将两个Vector3 作为输入,它们是世界空间中的正向(和一个可选的向上向量 - 默认为Vector3.up),并返回一个Quaternion 表示此类参考框架的方向。

您将提供一个世界空间位置作为输入 (targetPosition),这没有任何意义。意外地,在世界空间中表示的归一化位置向量是从原点到给定点的方向,因此当塔放置在原点上时它可以正常工作。

您需要用作 LookRotation 参数的是从塔到目标的世界空间方向:

Vector3 aimDir = (targetPosition - transform.position).normalized;
desiredRotation = Quaternion.LookRotation (aimDir );

【讨论】:

谢谢。这是一个非常明确的回应。谈论对细节的关注,当你编辑我的代码时,你甚至编辑了对行号的引用。谢谢 很好的答案,只需注意,在将方向传递给LookRotation 之前,不需要对其进行规范化。

以上是关于四元数 LookRotation的主要内容,如果未能解决你的问题,请参考以下文章

Unity四元数

Unity四元数

Unity四元数

unity 使用四元数旋转向量

让炮台口逐渐转向玩家(四元数)

基于四元数的 3D 相机应该累积四元数还是欧拉角?