Показать сообщение отдельно
Старый 01.10.2010, 11:38
3Desian вне форума Посмотреть профиль Отправить личное сообщение для 3Desian Найти все сообщения от 3Desian
  № 2  
Ответить с цитированием
3Desian
 
Аватар для 3Desian

Регистрация: Mar 2007
Сообщений: 142
Отправить сообщение для 3Desian с помощью ICQ
Итак у меня получилось выбирать точку на 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

Такое ощущение, что плоскость ориентируется относительно какой то невидимой сферы в центре.
Вложения
Тип файла: swf Mouse3DFloor1.swf (76.2 Кб, 64 просмотров)
Тип файла: swf Mouse3DFloor2.swf (76.2 Кб, 111 просмотров)