在3D中反转旋转,使对象始终面向相机?

syd*_*ydd 5 flash 3d actionscript-3

我有很多精灵排列在3D空间,他们的父容器应用了旋转.如何反转精灵3D旋转,他们总是面对相机(Actionscript 3)?

下面是代码来测试它:

package{
import flash.display.Sprite;
import flash.events.Event;
public class test extends Sprite{

var canvas:Sprite = new Sprite();
var sprites:Array = []

public function test(){
    addChild(canvas)
    for (var i:int=0;i<20;i++){
        var sp:Sprite = new Sprite();
        canvas.addChild(sp);
        sp.graphics.beginFill(0xFF0000);
        sp.graphics.drawCircle(0,0,4);
        sp.x = Math.random()*400-200;
        sp.y = Math.random()*400-200;
        sp.z = Math.random()*400-200;
        sprites.push(sp);
    }
    addEventListener(Event.ENTER_FRAME,function():void{
        canvas.rotationX++;
        canvas.rotationY = canvas.rotationY+Math.random()*2;
        canvas.rotationZ++;
        for (var i:int=0;i<20;i++){
            //this is not working...
            sprites[i].rotationX = -canvas.rotationX
            sprites[i].rotationY = -canvas.rotationY
            sprites[i].rotationZ = -canvas.rotationZ
        }
    })
}
}
}
Run Code Online (Sandbox Code Playgroud)

我猜我必须用sprites的rotation3D矩阵做一些魔法......我试图实现这个脚本:http://ughzoid.wordpress.com/2011/02/03/papervision3d-sprite3d/,但是如此成功
感谢您的帮助.

dat*_*olf 21

最简单的方法是"清除"变换矩阵的旋转部分.您典型的同质转换看起来像这样

| xx xy xz xw |
| yx yy yz yw |
| zx zy zz zw |
| wx wy wz ww | 
Run Code Online (Sandbox Code Playgroud)

wx = wy = wz = 0,ww = 1.如果仔细观察,你会发现实际上这个矩阵由一个定义旋转的3x3子矩阵,一个用于平移的3个子矢量和一个同质行0 0组成. 0 1

| R       T |
| (0,0,0) 1 |
Run Code Online (Sandbox Code Playgroud)

对于广告牌/精灵,你想保持翻译,但摆脱旋转,即R = I.如果应用了一些缩放,身份也需要缩放.

这给出了以下的收件人:

d = sqrt(xx²+yx²+zx²)

| d 0 0 T.x |
| 0 d 0 T.y |
| 0 0 d T.z |
| 0 0 0   1 |
Run Code Online (Sandbox Code Playgroud)

加载此矩阵可以绘制相机对齐的精灵.