将Sketchup变换转换为Three.js旋转+缩放+位置或矩阵

时间:2013-07-05 17:12:41

标签: three.js sketchup

我正在SketchUp中编写一个导出脚本(ruby),我在Three.js中应用相同的变换时遇到了麻烦,因此对象在Three.js中的旋转与SketchUp中出现的旋转相同。

我可以使用SketchUp Transformation类读取旋转:http://www.sketchup.com/intl/en/developer/docs/ourdoc/transformation.php

我可以从我传递给Three.js代码的旋转组件中获取这些值。所有都是X,Y,Z形式的向量

xaxis: 0.0157771536190692,-0.0,-0.0199058138160762
yaxis: -0.0199058138160762,0.0,-0.0157771536190692
zaxis: 0.0,0.0254,-0.0 
origin: 1.4975125146729,0.0,-1.25735397455338

如果我只是将值从origin复制到Object3D.position,则对象的位置正确。但我不知道如何将xaxis,yaxis和zaxis值应用于Object3D.rotation。

Three.js有各种方式来旋转模型,通过矩阵操作,四元数,角度,弧度等等。但是如何使用这些轴值设置对象旋转?

编辑:

SketchUp Transformation还提供了一个.to_a(to array)方法,我认为它应该返回一个16元素矩阵。我尝试在Three.js中使用它:

// tm is from SketchUp:Transformation to_a
var tm = "0.621147780278315,0.783693457325836,-0.0,0.0,-0.783693457325836,0.621147780278315,0.0,0.0,0.0,0.0,1.0,0.0,58.9571856170433,49.5021249824165,0.0,1.0";
    tm = tm.split(",");
for (var i = 0; i < tm.length; i++) {
  tm[i] = tm[i] * 1.0;
}

var matrix = new THREE.Matrix4(tm[0], tm[1], tm[2], tm[3], tm[4], tm[5], tm[6], tm[7], tm[8], tm[9], tm[10], tm[11], tm[12], tm[13], tm[14], tm[15]);

obj.applyMatrix(matrix);

然而,这导致了一团糟,所以仍然有问题。

2 个答案:

答案 0 :(得分:0)

根据以下信息:http://sketchucation.com/forums/viewtopic.php?f=180&t=46944&p=419606&hilit=matrix#p419606

我能够构建一个有效的Matrix4。我认为问题在于单位尺度(参见某些元素中的.to_m转换)和矩阵数组元素的顺序。在Sketchup中:

tr = transformation.to_a

trc = [tr[0],tr[8],-(tr[4]),tr[12].to_m, tr[2],tr[10],-(tr[6]),tr[14].to_m, -(tr[1]),-(tr[9]),tr[5],-(tr[13].to_m), 0.0, 0.0, 0.0, 1.0] # the last 4 values are unused in Sketchup

el.attributes["tm"] = trc.join(",") # rotation and scale matrix

el.attributes["to"] = convertscale(transformation.origin) # position

在Three.js

var origin = this.parsevector3(node.getAttribute("to"));
obj.position = origin;


var tm = node.getAttribute("tm");
    tm = tm.split(",");
for (var i = 0; i < tm.length; i++) {
  tm[i] = tm[i] * 1.0;
}

var matrix = new THREE.Matrix4(tm[0], tm[1], tm[2], tm[3], tm[4], tm[5], tm[6], tm[7], tm[8], tm[9], tm[10], tm[11], tm[12], tm[13], tm[14], tm[15]);

obj.applyMatrix(matrix);

很抱歉代码中有一些特定于应用程序的逻辑,但我认为无论是否有人遇到类似问题,都可以找到这个想法。

答案 1 :(得分:0)

  

SketchUp Transformation还提供了一个.to_a(to array)方法,我认为它应该返回一个16元素矩阵。

自从您发布此内容已经有一段时间了,但对于将来遇到这种情况的人来说,这是一个有用的链接:http://www.martinrinehart.com/models/tutorial/tutorial_t.html