1

頂点をループして、それぞれに平面をマッピングしました。平面を正しく方向付けるのに問題があります。球体で動作させることはできますが、プリミティブに変更を加えると、位置は正しいのですが、向きや傾きが正しくありません。

編集: 注 - 球への変更は、球が作成される前に行われました。細長い球体を作成するために 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);
}
4

1 に答える 1

1

次のデモは、問題を最小限に抑える方法を示しています。乗算係数を 0.6 から 2.0 に変更し、効果を誇張して簡単に確認できるように球のサイズも変更しました。Sphere.as も 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);
        }
    }
}
于 2009-12-15T17:19:06.437 に答える