【问题标题】:Three.js SkinnedMesh jitter when far from scene root (0,0,0) on IOSIOS上远离场景根(0,0,0)时的Three.js SkinnedMesh抖动
【发布时间】:2018-12-10 17:49:49
【问题描述】:

我正在使用 Three.js 和 Blender 开发一款第三人称 RPG 风格的游戏。世界地形平铺并在各个方向无限循环,当玩家 obj 接近沿 z 或 x 定义的边缘时触发。我正在使用 FBX 导入器,在大多数平台上一切正常。

在 IOS 设备上,当我将播放器对象从场景根移动到任何显着距离时,表面材质开始抖动并破裂。离根越远,情况越糟。这显然与 IOS 设备如何处理浮点计算有关,如这些相关线程中所引用的:

GitHub Three.js
Related (from '04)
Related from '07

如果找到了可行的解决方案,我找不到任何具体/应用示例。

我尝试了多种方法,但都没有成功。我真的不想移动世界而不是玩家。当我尝试过时,我只是不够聪明,无法弄清楚。沿着 z 移动还不错,但是无论建立什么组或父/子关系,或者从什么复制和设置什么,我都无法在 y 上进行对象旋转或移动枢轴点来工作。网格的矩阵变换也效果不佳。

这可能是一个非常愚蠢的问题,但是有没有更简单的方法可以将原点或场景根重置到玩家当前位置的任何位置?喜欢完成相机、灯光、位置和旋转?

我真的很想让这个项目在 IOS 设备上运行。

提前感谢您的任何建议。

【问题讨论】:

    标签: javascript ios three.js


    【解决方案1】:

    当您遇到浮点精度问题时,您有两种选择:

    1. 让您的世界更小。假设您的主角身高 1000 个单位,那么您“浪费”了很多精度。您可以将其设置为 10 或 1 个单位高,并将其他所有内容按比例缩小,这样您就永远不会达到足以遇到错误的值。
    2. 您可以简单地将环境与主要角色分开嵌套,然后移动它。像这样:
    scene = new THREE.Scene();
    
    // Instead of adding environment features to scene, 
    // you add them to the environment group
    environment = new THREE.Group();
    environment.add(trees);
    environment.add(streets);
    environment.add(buildings);
    
    character = new THREE.Mesh(geometry, material);
    
    // Add environment separately from your character
    scene.add(environment);
    scene.add(character);
    
    // Instead of moving your character,
    // move the environment in the opposite direction
    environment.position.set(-x, -y, -z);
    

    这样,所有可见的都接近0, 0, 0。如果您需要执行旋转,请使用相同的规则:将其应用于环境,但方向相反。

    【讨论】:

    • 您好,谢谢 - 我已经尝试过 #1,但它只是放大了问题,越小事情越紧张,越快。我一直在尝试#2 - 我设置了几个组,一个地形框(地面、树木等)、一个玩家框(玩家、相机、灯光)和一个枢轴框(包含地形框)。玩家停留在 0,0,0,在沿 z 移动地形后,我可以相对于玩家旋转/旋转世界。我现在遇到的问题是沿着 z 相对于玩家旋转后所面对的方向平移……东西一直在横向滑动。
    • 基本上我只是在尝试更新地形,使其在旋转时与玩家面对的任何方向相反...
    猜你喜欢
    • 1970-01-01
    • 2013-01-28
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    相关资源
    最近更新 更多