小编jpw*_*yan的帖子

如何在模型的本地空间(非全局)中组合X,Y和Z旋转?

我开始在Molehill,并且在掌握Matrix3D时遇到了很多问题.我的第一个问题是如何管理描述单个模型方向的Matrix3D.

我使用Matrix3D.appendRotation()来做到这一点.但是根据我附加的顺序,我得到了不同的结果(显然,因为我在全球空间中一次旋转一个).我知道这是一个常见的问题,我已经用3d软件建模遇到了它.但这一次,我必须以编程方式修复它.这是我需要帮助的地方.

首先,如果有任何混淆,这是图片中的问题:

第1步:我渲染一个模型.

开始的位置

步骤2a:我在X轴上旋转它.看起来不错!

X轴旋转

步骤2b:我在Z轴上旋转它.看起来不错!

Z轴旋转

所以...如果我在模型的X和Z轴上旋转我想要这个:

想要的XZ旋转

但是,悲伤,我明白了:

在此输入图像描述

我可以看到问题.我在全球空间一次附加一个轮换.我需要在对象的本地空间中旋转.我不知道如何做到这一点或我甚至应该搜索什么(术语等).代码很简单(和错误):

modelLocalMatrix.identity();
modelLocalMatrix.appendRotation(modelZRot, Vector3D.Z_AXIS);
modelLocalMatrix.appendRotation(modelXRot, Vector3D.X_AXIS);
//eventually y-axis rotation as well...
renderMatrix.append(modelLocalMatrix);
Run Code Online (Sandbox Code Playgroud)

我猜测不是使用Vector3D轴常数,而是想使用一些规范化的矢量和一些......呃,东西......代替modelZRot,modelXRot,最后是modelYRot.谁能告诉我上面应用所需类型的旋转的最佳实践解决方案是什么?

更新:花了一天时间点击"书籍"(在YouTube上称为KhanAcademy)并在此处开始演示:3D旋转矩阵的数学我偶然发现了一种非常接近我想要的"看待"方法解.不幸的是,我只有50%的人理解它.我仍然希望有人可以对这个话题有所了解!

var angleOfRotation:Number = Math.PI / 2; //90 degrees...
var axisOfRotation:Vector3D = new Vector3D(0, 1, 0); //some point to look at... 
//normalize the vector!
axisOfRotation.normalize();
var x:Number = axisOfRotation.x;
var y:Number = axisOfRotation.y;
var z:Number = axisOfRotation.z;
var c:Number = Math.cos(angleOfRotation);
var s:Number = Math.sin(angleOfRotation);
var t:Number = 1 - c;

//Graphics Gems …
Run Code Online (Sandbox Code Playgroud)

rotation actionscript-3 matrix-multiplication molehill stage3d

8
推荐指数
1
解决办法
2007
查看次数

如何一次从3个给定点绘制连续曲线

我试图在闪光灯中画一条连续的曲线.有很多方法,但到目前为止,我发现的方法都不符合我的要求.首先,我想使用flash图形api的curveTo()方法. 我不想模拟每曲线段数百次调用lineTo()的曲线. 根据我的经验和理解,线段处理器很重.Flash的二次贝塞尔曲线应该占用较少的CPU功率.如果你认为我错了,请挑战这个假设.

我也不想使用以整行作为参数的预制方法(例如mx.charts.chartClasses.GraphicsUtilities.drawPolyline()).原因是我最终需要修改逻辑以向我绘制的线添加装饰,所以我需要在最低级别理解的东西.

我现在创建了一个方法,使用此处的中点方法绘制给出3个点的曲线.

这是一张图片:

使用实际点作为控制点的连续曲线

问题是线条实际上并没有穿过线条的"真实"点(灰色圆圈).有没有办法利用数学的力量,我可以调整控制点,使曲线实际上通过"真实"点?仅给出当前点及其上一个/下一个点作为参数?复制上面图片的代码如下.如果我可以修改它以满足此要求,那将是很好的(注意第一点和最后一点的例外).

package {
  import flash.display.Shape;
  import flash.display.Sprite;
  import flash.display.Stage;
  import flash.geom.Point;

  [SWF(width="200",height="200")]
  public class TestCurves extends Sprite {
    public function TestCurves() {
      stage.scaleMode = "noScale";
      var points:Array = [
        new Point(10, 10), 
        new Point(80, 80), 
        new Point(80, 160), 
        new Point(20, 160), 
        new Point(20, 200),
        new Point(200, 100)
      ];

      graphics.lineStyle(2, 0xFF0000);

      var point:Point = points[0];
      var nextPoint:Point = points[1];

      SplineMethod.drawSpline(graphics, point, null, nextPoint);

      var prevPoint:Point = point;

      var n:int = …
Run Code Online (Sandbox Code Playgroud)

apache-flex bezier continuous spline actionscript-3

7
推荐指数
1
解决办法
7066
查看次数