【问题标题】:AFrame Physics Impulse is not at centerAFrame 物理脉冲不在中心
【发布时间】:2016-08-31 02:37:00
【问题描述】:

很简单,我想直接向上射击一个立方体,让它平放,而不是旋转。如果可能的话,我也希望它能够在施加相同的力矢量时可靠地结束在相同的位置......但这可能是一个大炮问题。

http://codepen.io/msj121/pen/zKOvPW

<a-scene physics>
    <!-- Camera -->
    <a-entity camera universal-controls position="0 1 0"></a-entity>

    <!-- Floor -->
    <a-grid static-body position="0 0 0"></a-grid>

    <!-- <a-sphere position="0 1 0.5" width="1" height="1" depth="1" color="#000000"></a-sphere>
    <a-sphere position="0 1 -0.5" width="1" height="1" depth="1" color="#000000"></a-sphere> -->
  <!-- Immovable box -->
  <!-- <a-sphere static-body position="0 2 -3" width="3" height="1" depth="1"></a-sphere> -->

  <!-- Dynamic box -->
  <a-entity geometry="box" id="cannon" src="/images/earth.jpg" dynamic-body position="0 1 -3" width="1" height="1" depth="1" color="#33AA33"></a-entity>

    <!-- Dynamic box -->
    <!-- <a-box dynamic-body position="0 1 -1" width="1" height="1" depth="1" color="#000000"></a-box> -->
  </a-scene>
  <div class="card card-block" style="position:absolute;left:0px;bottom:0px;width:250px;background-color:white;z-index:999">
    <h3 class="card-title">Forces:</h3>
    <div class="form-group row">
      <label for="example-text-input" class="col-xs-7 col-form-label">X Direction:</label>
      <div class="col-xs-5">
        <input class="form-control" type="text" value="0" id="x">
      </div>
    </div>
    <div class="form-group row">
      <label for="example-text-input" class="col-xs-7 col-form-label">Y Direction:</label>
      <div class="col-xs-5">
        <input class="form-control" type="text" value="20" id="y">
      </div>
    </div>
    <div class="form-group row">
      <label for="example-text-input" class="col-xs-7 col-form-label">Z Direction:</label>
      <div class="col-xs-5">
        <input class="form-control" type="text" value="0" id="z">
      </div>
    </div>
    <a id="impulseButton" class="btn btn-success" style="float:right;color:white" >Apply Force</a>
  </div>
  <script type="text/javascript">
    $(document).ready(function(){
      $("#impulseButton").on("click",function(){
        applyImpulse();
      });

      function applyImpulse(){
        var x = $("#x").val();
        var y = $("#y").val();
        var z = $("#z").val();
        if(x>=0 && y>=0 && z>=0){
          var el = $('#cannon')[0];
          console.log(new CANNON.Vec3(x,y,z));
          console.log(new CANNON.Vec3().copy(el.body.position));
          console.log(new CANNON.Vec3().copy(el.object3D.position));
          el.body.applyImpulse(
            /* impulse */        new CANNON.Vec3(x,y,z),
            /* world position */ new CANNON.Vec3().copy(el.body.position)
          );
        }
        else{
          alert("Values must be greater or equal to 0")
        }
      }
    });
  </script>

【问题讨论】:

    标签: physics aframe cannon.js


    【解决方案1】:

    我认为这只是模拟噪音,但您可以使用CANNON.Body methods 来限制旋转:

    el.body.fixedRotation = true;
    el.body.updateMassProperties();
    

    【讨论】:

    • 谢谢。效果很好!你知道 cannon.js 在每次模拟中获得相同的物理结果是否可靠?好像没有……有这方面的经验吗?
    • 我没有看到 Math.random() 在其主要代码库中使用。因此,如果您控制时钟速度/确保步长始终相同,则可能是确定性的。我的代码uses the framerate to time physics,表现良好,但可能允许变化。
    • 如果模拟完全独立于渲染运行,只需在可用时绘制场景,但根据实际时间等计算......而不是动画中的步骤,那将会很整洁。这将有助于使模拟相同。不过,它是一个很棒的库,感谢您开发它。也许大多数人并不需要每次都表现得一样。
    • 不幸的是,使用实际时间的模拟仍然不能确定,因为setInterval 是非常近似的。为了获得真正的保证,即使实际上已经过去了 40 毫秒,您也需要在每个步骤上使用固定时间(例如 10 毫秒),这意味着对象的移动速度比应有的慢或快。所以,我不确定如何同时拥有现实的时机和确定性的行为。如果有办法,肯定会很高兴支持。
    • 很遗憾,你的权利。我认为它是 cannon.js 本身的一个问题,它的编码方式。无论系统如何,它都应该通过使用 Date() 并根据绘制事件更新到正确的帧来跟踪实时。假设您具有良好的帧速率(即使它不是恒定的),您始终可以获得与实际使用时间相同的模拟。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多