Javascript 如何设置某些对象';s坐标而不重置其他坐标?

Javascript 如何设置某些对象';s坐标而不重置其他坐标?,javascript,3d,aframe,webvr,Javascript,3d,Aframe,Webvr,我试图只调整对象的Y坐标,同时保持X和Z坐标相同。我使用的唯一方法是获取对象的位置并组成一个新的部分修改的位置。它不漂亮,而且似乎效率很低。看起来这可能是因为这样的事实,所以这可能是不可能的 以下是我当前的解决方案: index.html: <html> <head> <script src="https://aframe.io/releases/0.6.0/aframe.min.js"></script> </head&g

我试图只调整对象的Y坐标,同时保持X和Z坐标相同。我使用的唯一方法是获取对象的位置并组成一个新的部分修改的位置。它不漂亮,而且似乎效率很低。看起来这可能是因为这样的事实,所以这可能是不可能的

以下是我当前的解决方案:

index.html:

<html>
  <head>
    <script src="https://aframe.io/releases/0.6.0/aframe.min.js"></script>
  </head>
  <body>
    <a-scene>
      <a-camera id="camera"></a-camera>
    </a-scene>
    <script src="index.js"></script>
  </body>
</html>
你可以:

  • 设置一个临时
    位置
    变量,仅更改所需的部分:
    let pos=this.el.getAttribute('position');
    pos.x+=速度;
    此.el.setAttribute('position',pos)
    
  • 使用Rainer Witmann的想法,通过使用
    Object.Assign()
    ,切割临时对象:
    this.el.setAttribute('position',Object.assign({},this.el.getAttribute('position'),{x:newX}))
    
    看起来比较短,但我喜欢将整个职位作为临时变量: 住在这里:

  • 通过更改数据并调用
    update()
    函数:
    this.el.components.position.data.z-=2;
    this.el.components.position.update()
    
    这很有趣,但我认为在创建商业/专业项目时,这是一个糟糕的想法,因为每个框架操作都是这样

  • 使用threejs object3D属性:
    this.el.object3D.position.x+=速度
    在我的小提琴中查看:
    请注意,稍后您将无法调用
    getAttribute()
    ,因为位置组件不会更改
在您的故障中,您使用第一个选项,但不需要单独使用位置对象属性:
setAttribute('position',{x:pos.x,y:pos.y,z:pos.z})
,您可以简单地使用整个对象:
setAttribute('position',pos)

您可以:

  • 设置一个临时
    位置
    变量,仅更改所需的部分:
    let pos=this.el.getAttribute('position');
    pos.x+=速度;
    此.el.setAttribute('position',pos)
    
  • 使用Rainer Witmann的想法,通过使用
    Object.Assign()
    ,切割临时对象:
    this.el.setAttribute('position',Object.assign({},this.el.getAttribute('position'),{x:newX}))
    
    看起来比较短,但我喜欢将整个职位作为临时变量: 住在这里:

  • 通过更改数据并调用
    update()
    函数:
    this.el.components.position.data.z-=2;
    this.el.components.position.update()
    
    这很有趣,但我认为在创建商业/专业项目时,这是一个糟糕的想法,因为每个框架操作都是这样

  • 使用threejs object3D属性:
    this.el.object3D.position.x+=速度
    在我的小提琴中查看:
    请注意,稍后您将无法调用
    getAttribute()
    ,因为位置组件不会更改
在您的故障中,您使用第一个选项,但不需要单独使用位置对象属性:
setAttribute('position',{x:pos.x,y:pos.y,z:pos.z})
,您可以简单地使用整个对象:
setAttribute('position',pos)

您也可以使用。大概是这样的:

camera.setAttribute('position', Object.assign({}, camera.getAttribute('position'), {x: 5})
你也可以使用。大概是这样的:

camera.setAttribute('position', Object.assign({}, camera.getAttribute('position'), {x: 5})

更改底层的Three.js位置不会在以后把事情搞砸吗?如果我在框上执行
getAttribute('position')
,它不是旧位置吗?第二个解决方案是我目前正在做的事情,看起来这可能是唯一的办法。@jbjw是的,正如我所写的,我通常使用“临时变量”选项来保持状态,我已经更新了anwser以避免混淆,如果你想找一个干净的单行程序,请使用Rainers的想法,我仍然希望将position对象作为一个整体放在引用中。以后更改底层的Three.js position不会把事情搞砸吗?如果我在框上执行
getAttribute('position')
,它不是旧位置吗?第二个解决方案是我目前正在做的事情,看起来这可能是唯一的办法。@jbjw是的,正如我所写的,我通常使用“临时变量”选项来保持状态,我已经更新了anwser以避免混淆,如果你想找一个干净的单行程序,请使用Rainers的想法,我仍然希望将position对象作为一个整体放在引用中。这仍然会覆盖整个position,但看起来这是唯一的方法,并且
对象。assign
比我的分解-重新组合解决方案漂亮得多。谢谢这仍然覆盖了整个位置,但看起来这是唯一的方法,
Object.assign
比我的分解-重新组合解决方案漂亮得多。谢谢