java - 角色的头已经转了60°,怎么让角色的 body 继续旋转呢?

标签 java c# unity3d google-cardboard

经过一些试验后,我将一个空的 (HeadCam) 放置在角色的脖子上。 此代码段允许头部与 CardboardHead/Camera 同步旋转。

void LateUpdate() {
    neckBone.transform.rotation = Camera.transform.rotation *  Quaternion.Euler( 0,0,-90);
    Camera.transform.position = HeadCam.transform.position;
}

enter image description here

当只有头部在 -60° 到 60° 范围内旋转时,角色的 ARM 不应该移动,之后我想移动整个角色,同时 ARM 仍然可见。只要角色旋转不超过180°,下面的方法就可以实现,然后角色翻转180°如何实现恒定旋转?

void LateUpdate() {
    Quaternion camRot = Camera.transform.rotation * Quaternion.Euler( 0,0,-90);                 
    neckBone.transform.rotation = camRot;
    float yrot = camRot.eulerAngles.y;
    float ydelta = 0;
    if ( yrot < 300f && yrot > 180 ) {
        ydelta = yrot - 300f;
    }
    if ( yrot > 60f && yrot < 180 ) {
        ydelta = yrot - 60;
    }
    playerObj.transform.rotation =  Quaternion.Euler(0, ydelta, 0); 
    Camera.transform.position = HeadCam.transform.position;
}

enter image description here

用于独立测试算法的 Java 小程序:https://github.com/3dbug/blender/blob/master/HeadCamRot.java

最佳答案

一个可能的解决方案是:

// Transform of the full body of the character.
Transform body;
// Transform of the head (child of |body| component).
Transform head;
// Maximum delta angle in degrees.
float maxAngle = 60.0f;

void RotateCharacter(Quaternion target) {
  // Rotate head as much as possible without exceeding the joint angle.
  head.rotation = Quaternion.RotateTowards (body.rotation, target, maxAngle);
  // Complete the remainder of the rotation by body.
  body.rotation = target * Quaternion.Inverse (head.localRotation);
}

请记住,您可能需要事先限制非水平旋转,即,我假设传递的旋转的给定 x 和 z 角度不会超过 maxAngle。此外,即便如此,如果需要,也可以在上面的函数中添加该限制。

希望对您有所帮助。

关于java - 角色的头已经转了60°,怎么让角色的 body 继续旋转呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30654290/

相关文章:

java - 这个问题的最佳数据结构?

c# - 通用表单和 VS 设计器

c# - 在单元测试期间获取引用项目的路径

unity3d - MonoDevelop在High Sierra上崩溃(OSX 10.13)

java - 在 Java 中,监视追加文件的最佳/最安全模式是什么?

java - 如何将字符串拆分为数组然后返回给定元素?

java - 在现有应用程序中实现缓存

C# LINQ 检测插入

c# - Unity - 调整一个游戏对象的大小以匹配另一个

ios - 是什么导致 iOS 游戏被添加到用户的游戏连接中?