代码之家  ›  专栏  ›  技术社区  ›  Josh

将平面映射到基本体

  •  1
  • Josh  · 技术社区  · 15 年前

    我已经遍历了顶点,并为每个顶点映射了一个平面。我无法正确定位飞机。我可以让它和一个球体一起工作,但是当我对原始的位置做任何修改时,它们是正确的,但是它们没有朝正确的方向/倾斜。

    编辑:注意-对球体的更改是在创建球体之前完成的。我已经更新了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);
    }
    
    1 回复  |  直到 15 年前
        1
  •  1
  •   Andy West    15 年前

    下面的演示展示了如何将问题最小化。我把倍增系数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);
            }
        }
    }