瀏覽代碼

SplineMesh: fix mesh that were broken when rotated

lviguier 3 月之前
父節點
當前提交
7043aaca19
共有 1 個文件被更改,包括 4 次插入5 次删除
  1. 4 5
      hrt/prefab/l3d/SplineMesh.hx

+ 4 - 5
hrt/prefab/l3d/SplineMesh.hx

@@ -202,13 +202,12 @@ class SplineMesh extends hrt.prefab.Object3D {
 				var absPos = spline.globalToLocal(samples[i].pos);
 				var absPos = spline.globalToLocal(samples[i].pos);
 				var curPos = absPos.clone();
 				var curPos = absPos.clone();
 				uv += curPos.distance(prevPos);
 				uv += curPos.distance(prevPos);
-				var tangent = samples[i].tangentOut.normalized();
-				var angle = hxd.Math.acos( tangent.dot(new h3d.Vector(1.0, 0.0, 0.0)) );
-				if (tangent.dot(new h3d.Vector(0.0, 1.0, 0.0)) < 0.0)
-					angle *= -1.0;
+				var tangent = samples[i].tangentOut.transformed3x3(spline.getAbsPos(true).getInverse()).normalized();
+				var q = new h3d.Quat();
+				q.initDirection(tangent);
 				var trs = new h3d.Matrix();
 				var trs = new h3d.Matrix();
 				trs.initTranslation(0.0, spacing, 0.0);
 				trs.initTranslation(0.0, spacing, 0.0);
-				trs.rotateAxis(new h3d.Vector(0.0, 0.0, 1.0), angle);
+				trs.rotate(q.toEuler().x, q.toEuler().y, q.toEuler().z);
 				trs.translate(absPos.x, absPos.y, absPos.z);
 				trs.translate(absPos.x, absPos.y, absPos.z);
 				fillPoint(vertexData, dataPos, localPoints, trs, uv, bounds);
 				fillPoint(vertexData, dataPos, localPoints, trs, uv, bounds);
 				dataPos += vertexDataStride * vertexPerPoint;
 				dataPos += vertexDataStride * vertexPerPoint;