Threejs网格矩阵getInverse未被捕获TypeError:无法读取未定义的属性“元素”

时间:2019-12-20 16:55:06

标签: three.js

由于

的异常,我有baisc问题,我正在努力使用ThreeJs api解决
  

未捕获的TypeError:无法读取未定义的属性“元素”

从本质上讲,这是一个非常基本的问题,很可能归因于对Threejs api的某些不当使用(也许我对网格物体.matrix表示了错误的假设/理解)。

我要解决的问题完全是基本的。

我有一些偏移坐标(x,y,z),其中(x,y,z)是vluae  在世界坐标系中。 让我们称此x,y,z偏移坐标为“方法”的概念。

这种方法表示与任意物体的偏移距离,我们可以称其为“ SomeObject”。

最终目标是,最好将此距离表示为空中球体,并将其作为SomeObject的子对象添加到场景中。

很明显,我不能简单地将这些(x,y,z)表示为现实世界坐标中的偏移量,而只能将我的球体添加为:

Approach.x = x;
Approach.y = y;
Approach.z = z;
SomeObject.add(appraoch)

上面的伪代码是完全错误的。 上面的代码没有意义,仅当SomeObject面向世界的角度为0度时才有效。在所有其他情况下,SomeObject的X,Y,Z轴不会与世界坐标系的位置重合,并且Sphere会出现在我对象的错误一侧。 简而言之,必须将此偏移量从世界坐标转换为SomeObject坐标。

从数学上来说,我的意思是微不足道的。 要解决的问题只不过是下面的同构变换矩阵乘法。

meshApproachTo2SomecObject = wolrd2SomeObjectMatrix X meshApproach2World.matrix;

就这样,游戏结束了。

我尝试运行的代码如下:

var whitekMaterial = new THREE.MeshBasicMaterial( {color: 0xFFFFF} );
var dummyGeometry = new THREE.SphereGeometry( 50);

var meshApproach2World = new THREE.Mesh( dummyGeometry, whitekMaterial );
meshApproach2World.position.x = 560;
meshApproach2World.position.y = -760;
meshApproach2World.position.z = 381;
meshApproach2World.updateMatrix();
// meshApproach2World.matrix.getPosition()


var someOject2World = new THREE.Mesh( dummyGeometry, whitekMaterial );
someOject2World.position.x = 0;
someOject2World.position.y = 0;
someOject2World.position.z = 0;
someOject2World.rotation.z = Math.PI/2;
someOject2World.updateMatrix();


// compute the COORDINATES of the APPRORACH OBJECT Relative to the "SOmeObject
// Mathmathicall APPROACH2SomeObject= World2SomeObject X Apporache2World
// Therefore
var wolrd2SomeObjectMatrix = someOject2World.matrix.getInverse();


// Do later 
// ApproachOffset2SomecObjectMatrix = wolrd2SomeObjectMatrix X ApproachOffset2WorldMatrix;

很明显,如果在我的SomeObject上方的练习中,相对于世界坐标系旋转了90度,则(x,y,z)的转换=(560,-760,381) 应该返回:

  

coordinates = CalcCoordinates [x = -760.0,y = -560.0,z = 381.0],   orientation = CalcOrientation [aYawDegrees = 270.0,bPitchDegrees = -0.0,   cRollDegrees = 0.0]

x2 = Y1 Y2 = -X1 Z2 = Z1

但是,当我尝试获取相对于某个对象的世界坐标时,我会卡住。

当我尝试获取逆矩阵时:

var wolrd2SomeObjectMatrix = someOject2World.matrix.getInverse();

Threejs爆炸了。

我认为,当您在threejs中具有网格时,MATRIX会代表该对象相对于世界的HTM。

因此,您应该能够获得4x4网格矩阵并求逆。 相反,它爆炸了……出现了一个不太容易理解的异常。

感谢您的帮助。

0 个答案:

没有答案