物理JS:结合动作和物理学

5

我已经寻找了一段时间,但似乎无法找到任何解决这个问题的方法。

我正在尝试使用THREE.JS和PHYSI.JS创建一个简单的场景来实现平台动作。我有一个质量为0的平面盒子作为我的工作区域,以及一个盒状网格作为我的角色。Physijs网站上建议我将__dirtyPosition变量设置为true。问题在于:__dirtyPosition会影响物理效果。当我将我的角色移出关卡边缘时,他并没有掉下去。事实上,当它碰撞时,它似乎停在了世界立方体的中间。

当我尝试更新位置而不应用__dirtyPosition时,立方体会被放回原处。它会微微颤抖,好像正在发生微小的抽搐,然后就没了。如果我能同时使用物理和运动,只使用Physi进行碰撞感觉有点过度。这是我现在错误的做法:

level1.generateScene = function()
{
   level1.camera = new THREE.PerspectiveCamera(75, this.cameraWidth / this.cameraHeight, 0.1, 1000);

   level1.material = new AdapterEngine.createBasicMaterial({color: 0x00ff00}); //Threejs basic material
   level1.ground = new AdapterEngine.createBoxMesh(5, 0.1, 5, level1.material, 0); //Physijs box mesh with a mass of 0

   level1.playerMaterial = new AdapterEngine.createBasicMaterial({color:0x0000ff}, 0.6, 0.3); //Physijs basic material with a fruction of 0.6, and a restitution of 0.3
   level1.player = new AdapterEngine.createBoxMesh(0.3, 0.3, 0.3, level1.playerMaterial, 0.1); //Physijs box mesh with a mass of 0.1
   level1.player.y = 50; //yes, it should fall down for a bit.

   level1.scene.add(level1.ground);
   level1.scene.add(level1.player);

   level1.camera.position.z = 5;
   level1.camera.position.y = 1.4;
   level1.activeCamera = level1.camera;
   level1.controls.init();
}

这是创建“级别”(包括字符和世界)的函数。此外,级别对象还包含一个更新函数,在请求动画帧函数调用后播放,并在渲染器渲染之前执行。
level1.update = function()
{
   this.scene.simulate();

   level1.player.__dirtyPosition = true;
   if(level1.controls.isKeyDown('RIGHT')) level1.xvelocity = 0.1;
   else if(level1.controls.isKeyDown('LEFT')) level1.xvelocity = -0.1;
   else if(level1.controls.isKeyUp('RIGHT') || level1.controls.isKeyUp('LEFT')) level1.xvelocity = 0;

   level1.player.rotation.x = 0;
   level1.player.rotation.y = 0;
   level1.player.rotation.z = 0;

   level1.player.position.x = level1.player.position.x + 0.5*level1.xvelocity;
}

我知道类似的问题已经出现了,但都没有得到令人满意的答案。我真的不知道该怎么做,或者应该使用哪些函数。
编辑:我忘记添加这部分内容了:我一直在使用一个小框架来确定我是否应该获取一个THREE.js对象或一个PHYSI.js对象,它作为我的游戏和库之间的桥梁。它们遵循与THREE.js和PHYSI.js相同的参数,我已经用注释标记了返回哪种类型对象的函数。

我喜欢很多物理引擎根本没有实现适当的动力学角色控制器。等等,不对,是另外一种感觉。讨厌。 - jozxyqk
2个回答

1

首先,你不应该使用__dirtyPosition来操作速度。我建议使用setLinearVelocitygetLinearVelocity

level1.update = function(){
    this.scene.simulate();

    // Conditions...

    var oldVector = this.player.getLinearVelocity(); // Vector of velocity the player already has
    var playerVec3 = new THREE.Vector3(oldVector.x + .5 * this.xvelocity, oldVector.y, oldVector.z);
    this.player.setLinearVelocity(playerVec3); // We use an updated vector to redefine its velocity
}

其次,您遇到这个问题的原因可能是因为您没有将__dirtyRotation标志设置为true。您只需要在想要重置旋转的小区域中设置即可。除此之外,根据您发布的内容,我没有发现任何问题。

嘿,快问一下。我正在尝试做一个基本的空战游戏,取得了不错的成绩,但是现在我需要能够沿着直线移动,而不是一直对抗惯性力。我可以使用setlinearvelocity,但我确信这会破坏物理碰撞。当飞机的运动不是由物理学设置时,如何处理飞机以45度角撞向墙壁的情况?是否有一种使用applyForce实现类似于飞机转向的方法? - LJD

0

对于单个立方体的移动,建议使用object.setLinearVelocity(vector)而不是使用object.__dirtyPosition

我认为__dirtyPosition通常会禁用大部分物理效果


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接