Actionscript 3 将平面映射到基本体

Actionscript 3 将平面映射到基本体,actionscript-3,3d,papervision3d,Actionscript 3,3d,Papervision3d,我已经通过顶点循环并将一个平面映射到每个顶点。我无法正确定位飞机。我可以让它与球体一起工作,但当我对基本体进行任何修改时,它们的位置是正确的,但它们的朝向/倾斜方式不正确 编辑:注意-对球体的替换是在创建球体之前完成的。我已经更新了Sphere类以创建一个拉长的球体。 我用于放置平面的代码如下所示: pivotDO3D = new DisplayObject3D(); scene.addChild(pivotDO3D); var bigSphere:Sphere = new Sphere(nul

我已经通过顶点循环并将一个平面映射到每个顶点。我无法正确定位飞机。我可以让它与球体一起工作,但当我对基本体进行任何修改时,它们的位置是正确的,但它们的朝向/倾斜方式不正确

编辑:注意-对球体的替换是在创建球体之前完成的。我已经更新了Sphere类以创建一个拉长的球体。

我用于放置平面的代码如下所示:

pivotDO3D = new DisplayObject3D();
scene.addChild(pivotDO3D);
var bigSphere:Sphere = new Sphere(null, 500, 20, 20);

for each (var v:Vertex3D in bigSphere.geometry.vertices)
{
 var __seatmaterial:ColorMaterial = new ColorMaterial(0x000000);
 __seatmaterial.doubleSided = true;
 var p:Plane = new Plane(__seatmaterial, 20, 20, 2, 2);
 pivotDO3D.addChild(p);
 p.position = v.toNumber3D();
 p.lookAt(bigSphere);
}

下面的演示演示如何将问题最小化。我将乘法因子0.6更改为2.0,以及球体大小,以便放大效果,以便您可以轻松地看到它。还要确保将球体中的0.6更改为2.0

关键在于用球体上点的z位置改变目标点的z位置

要进行比较,请按原样运行以查看“固定”版本,并将lookAt目标从pivotDO3D2更改为bigSphere以查看旧版本

package
{
    import flash.display.Sprite;
    import flash.events.Event;

    import org.papervision3d.cameras.*;
    import org.papervision3d.core.geom.renderables.*;
    import org.papervision3d.materials.*;
    import org.papervision3d.objects.*;
    import org.papervision3d.objects.primitives.*;
    import org.papervision3d.render.*;
    import org.papervision3d.scenes.*;
    import org.papervision3d.view.*;

    [SWF(width='400', height='400', backgroundColor='0x000000', frameRate='30')]

    public class PlaneOrientationDemo extends Sprite
    {
        private var scene:Scene3D;
        private var camera:Camera3D;
        private var renderer:BasicRenderEngine;
        private var viewport:Viewport3D;
        private var pivotDO3D:DisplayObject3D;

        public function PlaneOrientationDemo()
        {
            viewport = new Viewport3D(0, 0, true, true);
            addChild( viewport );

            renderer = new BasicRenderEngine();                         
            scene = new Scene3D( );

            camera = new Camera3D();
            camera.z = -700;
            camera.zoom = 50;

            pivotDO3D = new DisplayObject3D();
            scene.addChild(pivotDO3D);

            var pivotDO3D2:DisplayObject3D = new DisplayObject3D();

            var bigSphere:Sphere = new Sphere(null, 150, 20, 20);

            for each (var v:Vertex3D in bigSphere.geometry.vertices)
            {
                 var __seatmaterial:ColorMaterial = new ColorMaterial(0x00FF00);
                 __seatmaterial.doubleSided = true;
                 var p:Plane = new Plane(__seatmaterial, 20, 20, 2, 2);
                 pivotDO3D.addChild(p);
                 p.position = v.toNumber3D();

                 // This number should match the fx multiplication factor in Sphere.as.
                 var xFactor:Number = 2.0;

                 pivotDO3D2.z = v.z / (Math.PI / xFactor);
                 p.lookAt(pivotDO3D2);
            }

            stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
        }

        private function onEnterFrame(event: Event): void
        {
            pivotDO3D.rotationX += 1;
            pivotDO3D.rotationY += 1;
            renderer.renderScene(scene, camera, viewport);
        }
    }
}

下面的演示演示如何将问题最小化。我将乘法因子0.6更改为2.0,以及球体大小,以便放大效果,以便您可以轻松地看到它。还要确保将球体中的0.6更改为2.0

关键在于用球体上点的z位置改变目标点的z位置

要进行比较,请按原样运行以查看“固定”版本,并将lookAt目标从pivotDO3D2更改为bigSphere以查看旧版本

package
{
    import flash.display.Sprite;
    import flash.events.Event;

    import org.papervision3d.cameras.*;
    import org.papervision3d.core.geom.renderables.*;
    import org.papervision3d.materials.*;
    import org.papervision3d.objects.*;
    import org.papervision3d.objects.primitives.*;
    import org.papervision3d.render.*;
    import org.papervision3d.scenes.*;
    import org.papervision3d.view.*;

    [SWF(width='400', height='400', backgroundColor='0x000000', frameRate='30')]

    public class PlaneOrientationDemo extends Sprite
    {
        private var scene:Scene3D;
        private var camera:Camera3D;
        private var renderer:BasicRenderEngine;
        private var viewport:Viewport3D;
        private var pivotDO3D:DisplayObject3D;

        public function PlaneOrientationDemo()
        {
            viewport = new Viewport3D(0, 0, true, true);
            addChild( viewport );

            renderer = new BasicRenderEngine();                         
            scene = new Scene3D( );

            camera = new Camera3D();
            camera.z = -700;
            camera.zoom = 50;

            pivotDO3D = new DisplayObject3D();
            scene.addChild(pivotDO3D);

            var pivotDO3D2:DisplayObject3D = new DisplayObject3D();

            var bigSphere:Sphere = new Sphere(null, 150, 20, 20);

            for each (var v:Vertex3D in bigSphere.geometry.vertices)
            {
                 var __seatmaterial:ColorMaterial = new ColorMaterial(0x00FF00);
                 __seatmaterial.doubleSided = true;
                 var p:Plane = new Plane(__seatmaterial, 20, 20, 2, 2);
                 pivotDO3D.addChild(p);
                 p.position = v.toNumber3D();

                 // This number should match the fx multiplication factor in Sphere.as.
                 var xFactor:Number = 2.0;

                 pivotDO3D2.z = v.z / (Math.PI / xFactor);
                 p.lookAt(pivotDO3D2);
            }

            stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
        }

        private function onEnterFrame(event: Event): void
        {
            pivotDO3D.rotationX += 1;
            pivotDO3D.rotationY += 1;
            renderer.renderScene(scene, camera, viewport);
        }
    }
}

您是在创建所有平面之后还是之前更改位置?如果在创建平面后执行此操作,则应再次调用lookAt()。在创建每个平面时,我使用p.position=v.toNumber3D()设置平面的位置。我应该做两个循环吗?你是在创建所有平面之后还是之前改变位置?如果在创建平面后执行此操作,则应再次调用lookAt()。在创建每个平面时,我使用p.position=v.toNumber3D()设置平面的位置。我应该做两个循环吗?这是正确的,它不是一个球体-那么我应该看什么呢?平面方向是急剧偏离还是稍微偏离了一点?如果它不是球体,它是什么类型的网格?它是如何创建的?我需要更多的信息。另外,请看我回答中的新建议。我尝试了你的其他建议,但飞机都面临同样的问题-即不工作!我所做的是使用标准的sphere原语,并将循环中的fX值更改如下:var fX:Number=fRds*Math.sin(fRad2*Math.PI)*.6;它将球体拉长成橄榄球球的形状。好吧,我完全替换了我以前的答案,因为看起来我以前走错了方向。看看新的答案是否有帮助。这是正确的,它不是一个球体-那么我应该看什么?平面方向是明显偏离还是稍微偏离了一点?如果它不是球体,它是什么类型的网格?它是如何创建的?我需要更多的信息。另外,请看我回答中的新建议。我尝试了你的其他建议,但飞机都面临同样的问题-即不工作!我所做的是使用标准的sphere原语,并将循环中的fX值更改如下:var fX:Number=fRds*Math.sin(fRad2*Math.PI)*.6;它将球体拉长成橄榄球球的形状。好吧,我完全替换了我以前的答案,因为看起来我以前走错了方向。看看新答案是否有用。