Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   API приложений и сред (http://www.flasher.ru/forum/forumdisplay.php?f=61)
-   -   [Papervision] Как определить направление нормали полигона? (http://www.flasher.ru/forum/showthread.php?t=145145)

3Desian 30.09.2010 13:52

Как определить направление нормали полигона?
 
Вложений: 1
Приветствую Вас.
Итак есть некий 3Д объект.
Хочу при наведении мышкой на какой либо полигон определить на нём точку прикосновения (А), затем определить направление нормали этого полигона из точки А и в финале задать на каком удалении от А будет точка (B) на нормали и определить положение (x,y,z) точки B в пространстве.
Вот картинка того, чего хочу.

Кто чем может подмочь? Если будут примеры с исходниками, то это супер.

3Desian 01.10.2010 11:38

Вложений: 2
Итак у меня получилось выбирать точку на 3Д объектах.
Код AS3:

package
{
        import flash.events.Event;
 
        import org.papervision3d.core.utils.Mouse3D;
        import org.papervision3d.materials.*;
        import org.papervision3d.materials.special.*;
        import org.papervision3d.objects.primitives.Plane;
        import org.papervision3d.objects.primitives.*;
        import org.papervision3d.view.BasicView;
        import org.papervision3d.view.layer.ViewportLayer;
        import org.papervision3d.view.layer.util.ViewportLayerSortMode;
 
        [SWF(width="640", height="480", backgroundColor="#000000", frameRate="60")]
        public class Mouse3DFloor extends BasicView
        {
                private var mouse3D:Mouse3D;
                private var follower:Plane;
 
 
                public function Mouse3DFloor()
                {
                        var h:headerContainer = new headerContainer();
                        h.header.text = "Following mouse position on a plane";
                        addChild(h);
 
                        viewport.interactive = true;
                        Mouse3D.enabled = true;
                        mouse3D = viewport.interactiveSceneManager.mouse3D;
 
 
                        var wireframeMaterial:WireframeMaterial = new WireframeMaterial(0x444444);
                        var colorMaterial:ColorMaterial = new ColorMaterial(0xdddddd);
                        var redColorMaterial:CompositeMaterial = new CompositeMaterial();
                        redColorMaterial.addMaterial(wireframeMaterial);
                        redColorMaterial.addMaterial(colorMaterial);
                        //var redColorMaterial:ColorMaterial = new ColorMaterial(0xcc0000);
                        redColorMaterial.interactive = true;
                        //10, 10 represent the number of segments in the plane
                        //var floor:Plane = new Plane(redColorMaterial, 2000, 2000, 10, 10);               
                        var floor:Cylinder = new Cylinder(redColorMaterial,400,2800,20,10);
                        floor.x=-500;
                        //floor.rotationX = 90;
 
                        var sphere:Sphere = new Sphere(redColorMaterial, 400, 18, 18);
                        sphere.z=1900;
                        scene.addChild(sphere);               
 
                        var greenColorMaterial:ColorMaterial = new ColorMaterial(0x00cc00);
                        follower = new Plane(greenColorMaterial, 300, 300);
                        follower.rotationX = 90;                       
                        scene.addChild(floor);                       
                        scene.addChild(follower);
 
                        camera.y = 1000;
                        camera.lookAt(sphere);
 
                        var floorViewportLayer:ViewportLayer = new ViewportLayer(viewport, floor);
                        var followerViewportLayer:ViewportLayer = new ViewportLayer(viewport, follower);
 
                        viewport.containerSprite.sortMode = ViewportLayerSortMode.INDEX_SORT;       
                        floorViewportLayer.layerIndex = 0;
                        followerViewportLayer.layerIndex = 1;
 
                        viewport.containerSprite.addLayer(floorViewportLayer);
                        viewport.containerSprite.addLayer(followerViewportLayer);
 
 
                        startRendering();
                }
 
                override protected function onRenderTick(event:Event=null):void
                {
                        follower.x += (mouse3D.x - follower.x) * 1;
                        follower.y += (mouse3D.y - follower.y) * 1;
                        follower.z += (mouse3D.z - follower.z) * 1;
 
                        //follower.copyTransform(mouse3D);
 
                        renderer.renderScene(scene, camera, viewport);
                }
 
        }
 
}

РЕЗУЛЬТАТ НА ПЕРВОЙ ФЛЭШКЕ Mouse3DFloor1.swf

Теперь осталось правильно ориентировать плоскость. Т.е. она должна поварачиваться в направлении нормали в точке.

Включаю: follower.copyTransform(mouse3D);
И получается какая то фигня.
РЕЗУЛЬТАТ НА ВТОРОЙ ФЛЭШКЕ Mouse3DFloor2.swf

Такое ощущение, что плоскость ориентируется относительно какой то невидимой сферы в центре.

3Desian 03.10.2010 15:24

Что, правда никто не знает?


Часовой пояс GMT +4, время: 20:04.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.