0

我正在 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

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

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

编辑:

SketchUp Transformation 还提供了一个 .to_a (到数组)方法,我认为它应该返回一个 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);

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

4

2 回答 2

0

基于此处的信息:http: //sketchucation.com/forums/viewtopic.php ?f=180&t=46944&p=419606&hilit=matrix#p419606

我能够构建一个工作的 Matrix4。我认为问题在于单位比例(请参阅某些元素中的 .to_m 转换)和矩阵数组元素的顺序。在草图中:

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);

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

于 2013-07-06T11:57:13.637 回答
0

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

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

于 2015-08-20T13:44:15.613 回答