代码之家  ›  专栏  ›  技术社区  ›  blue

统一不能让物体看另一个物体?总是面朝左边?

  •  1
  • blue  · 技术社区  · 6 年前

    我不知道这里发生了什么,但需要一个解决办法。这是一个非常简单的任务-我有一个空的,其中包含一个电枢/身体网格,我用它来移动,我需要身体旋转,以面对它正朝着的对象。

    我的问题是我的电枢在我的容器内对象的z轴向上,无论出于什么原因,使用任何子电枢或较大容器的注视旋转都会偏离90度,因此对象的左侧面向目标。

    enter image description here enter image description here

    我试过:

    Vector3 relativePos = test.transform.position - transform.position;
            Quaternion rotation = Quaternion.LookRotation(relativePos);
            transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * 1f);
    

    我试着用“看”和“看”两种方式,但都没用。我知道iTween正在处理旋转,因为这会使对象在z轴上旋转90度(我只需要对象面向矢量3.up轴上的目标-其中mainModel是电枢:

     iTween.RotateTo(mainModel, iTween.Hash(
                  "z", this.gameObject.transform.eulerAngles.x + 90,
                  "time", 1f,
                  "easetype", "easeInOutSine",
                  "looptype", "pingpong"
                ));
    

    1 回复  |  直到 6 年前
        1
  •  1
  •   Ruzihm aks786    6 年前

    LookRotation 带修改的 Quaternion RotateTowards 设置适当的最大转速。

    // Find out where we want to look    
    Quaternion targetRotation = Quaternion.LookRotation(test.transform.position 
                                                        - transform.position);
    targetRotation *= Quaternion.Euler(0f, 90f, 0f); // might need to be -90f
    
    
    // Find out how far to rotate
    float maxDegreesPerSecond = 90f; // This is your max speed for rotation in degrees/sec
    float maxDegreesDelta = maxDegreesPerSecond * Time.deltaTime; 
    transform.rotation = Quaternion.RotateTowards(transform.rotation,
                                                            targetRotation,
                                                            maxDegreesDelta); 
    

    为了避免向上/向下倾斜,您可以在将其送入系统之前将方向归零 外观旋转

    // Find out where we want to look 
    Vector3 targetDirection = test.transform.position - transform.position;
    targetDirection = new Vector3(targetDirection.x, 0f, targetDirection.z);
    
    Quaternion targetRotation = Quaternion.LookRotation(targetDirection);
    targetRotation *= Quaternion.Euler(0f, 90f, 0f); // might need to be -90f