【问题标题】:Raycaster does not move BoxMesh objectsRaycaster 不移动 BoxMesh 对象
【发布时间】:2016-01-02 19:15:04
【问题描述】:

我正在将 Physijs 脚本用于引力等物理学。 我想使用 THREE.js 脚本中的 Raycaster 移动场景中的对象。 我的问题是 Raycaster 只移动声明为如下的对象(简单框):

var box = new Physijs.Mesh(cubeGeomtery.clone(), createMaterial);

但是在这里物理学不起作用。只有当我这样声明时它才有效:

var create = new Physijs.BoxMesh(cubeGeomtery.clone(), createMaterial);

但是在这里Raycaster /移动不起作用。

这两者的区别在于,第一个只是Mesh,第二个是BoxMesh

有谁知道为什么这不起作用?我需要BoxMesh 才能使用重力和其他物理学。

添加立方体的代码

function addCube()
        {
            controls.enable = false;
            var cubeGeomtery = new THREE.CubeGeometry(85, 85, 85);
            var createTexture = new THREE.ImageUtils.loadTexture("images/rocks.jpg");
            var createMaterial = new THREE.MeshBasicMaterial({ map: createTexture });
            var box = new Physijs.BoxMesh(cubeGeomtery.clone(), createMaterial);
            box.castShadow = true;
            box.receiveShadow = true;
            box.position.set(0, 300, 0);
            objects.push(box);
            scene.add(box);
        }

【问题讨论】:

  • cubeGeomtery 是错字吗?似乎应该说cubeGeometry
  • 这是我的 cubeGeomtery var cubeGeomtery = new THREE.CubeGeometry(85, 85, 85);
  • 我在github.com/chandlerprall/Physijs/wiki/Basic-Shapes 的文档中找不到Physijs.Mesh。你能发布更多你的代码吗?
  • 看起来Mesh 属于 THREE.js。如果我创建 var create = new THREE.Mesh(cubeGeomtery.clone(), new THREE.MeshLambertMaterial({ color: 0x0000ff })); 移动就可以了。但是如果我用上面的代码创建对象 (new Physijs.BoxMesh) 它就不起作用

标签: javascript three.js physijs


【解决方案1】:

说明

在 Physijs 中,所有原始形状(例如 Physijs.BoxMesh)都继承自 Physijs.Mesh,而 Physijs.Mesh 又继承自 THREE.Mesh。在Physijs.Mesh 构造函数中,有一个小的内部对象:._physijs 字段。而且,在那个对象中,有一个... shape type 声明,默认设置为 null。该字段必须由其子项之一重新分配。如果没有,当形状被传递到场景时,Physijs 工作脚本将不知道要生成什么样的形状并简单地中止。由于Physijs.Scene 继承自THREE.Scene,因此场景在内部保留了对网格的引用,这意味着来自 THREE.js 的所有方法都将起作用(例如,光线投射)。但是,它从未注册为物理对象,因为它没有类型

现在,当您尝试使用其位置和旋转场直接移动Physijs.BoxMesh 时,它会立即被物理更新覆盖,该更新以场景对象中的.simulate 方法开始。调用时,它会委托工作人员计算与场景中的物理配置相对应的新位置和旋转。完成后,新值将传输回主线程并自动更新,因此您无需执行任何操作。在某些情况下,这可能是一个问题(比如这个!)。幸运的是,开发人员在Physijs.Mesh 中包含了两个特殊字段:.__dirtyPosition.__dirtyRotation 标志。以下是您如何使用它们:

// Place box already in scene somewhere else
box.position.set(10, 10, 10);

// Set .__dirtyPosition to true to override physics update
box.__dirtyPosition = true;

// Rotate box ourselves
box.rotation.set(0, Math.PI, 0);
box.__dirtyRotation = true;

通过.simulate 方法再次更新场景后,标志将重置为false

结论

自己创建Physijs.Mesh 基本上没用,请改用提供的原语之一。它只是 Physijs 的 THREE.Mesh 的包装,在其子项正确修改之前没有物理属性。

此外,当使用 Physijs 网格时,总是在对象中设置.__dirtyPosition.__dirtyRotation 属性以分别直接修改位置或旋转。看看上面的代码sn-p和here

【讨论】:

    猜你喜欢
    • 2015-06-17
    • 2015-12-25
    • 2020-07-28
    • 2015-08-07
    • 2014-11-30
    • 1970-01-01
    • 2021-04-30
    • 2020-09-11
    • 2018-08-29
    相关资源
    最近更新 更多