flash 3d flash3d 研究所 pv3d 共享资源  | 经典范例  | 视频教程  | 友情链接  | 联系我们
登陆 | 注册  flash 3d 研究所
讨论区





最近更新:
● ck47阁下在讨论区里 发表新主题“新手问题...”(07:49:50)
● 无语瓶阁下在教程区里 回复“《超简易papervision3D基础 ...”(18:09:44)
● payday loan阁下在教程区里 回复“《pv3d, sandy, away3d...”(05:56:23)
浏览主题:我们加入了一个orbitY方法,能帮助大家很容易的让摄像机绕竖轴在水平面旋转

我们加入了一个orbitY方法,能帮助大家很容易的让摄像机绕竖轴在水平面旋转
DDM君 (2008-11-18 23:30:22)

FreeCamera3D现在我们加入了一个orbitY方法。能帮助大家很容易的让摄像机绕竖轴在水平面旋转了,而且摄像机始终跟随着物体。
用来模拟类似第一人称设计类游戏。
点击这里下载新FreeCamera3D类

点击这里下载整个傻瓜包


orbitY()有4个参数。



第一个参数是摄像机看着和跟随着的物体,第二个参数是每祯旋转度数,以度数为单位;第三个参数摄像机是离物体的距离,默认是1000,第四个是摄像机的水平高,默认是0


举个例子,一般在enterfrmae里面使用:

camera:FreeCamera3D=new FreeCamera3D();
camera.lookAt(cube);

addEventListener(Event.ENTER_FRAME,process);

private function process(evt:Event):void {
camera.orbitY(cube,10,1000,500);
}




flash 3d 研究所 DDM君
(2008-11-18 23:46:00)
大家测试后遇到什么问题可以告诉我,好立即修改,感谢了^_^

flash 3d 研究所 苹果
(2008-11-19 12:23:21)
实现单一的绕y轴旋转测试通过,期待更复杂的效果

flash 3d 研究所 DDM君
(2008-11-19 13:28:50)
感谢苹果君。
不过暂时不准备在这方面继续,完美的全方位旋转其实是个死胡同,这也是为什么以前那个orbit被取消掉的原因,配合第4个参数大部分游戏需要的情况都够用的啦,呵呵。

具体有什么使用上要求都可以提,具体问题具体解决嘛。

flash 3d 研究所 Justin
(2008-11-24 16:02:45)
很实用的功能~~有个问题~为什么我下的pv3d里没FreeCamera3D类~是Camera3D类~~FreeCamera3D是官方的吗?难道我下的不是最新的,里面还有orbit方法~~

flash 3d 研究所 DDM君
(2008-11-24 16:58:05)
是的 为了避免很多麻烦 请直接使用我们这里提供的傻瓜包 里面都是最新的pv3d功能 而且随时会随google那边更新而更新,我们也在不断加入新功能 可以定时下载来覆盖以前的就是

flash 3d 研究所 martin
(2008-12-17 17:20:56)
你好,我用orbitY每次旋转一周后就会卡一下,不知道怎么回事!
[code]
package
{
     
     import flash.display.DisplayObject;
     import flash.display.Sprite;
     import flash.display.MovieClip;
     import flash.events.Event;
     import org.papervision3d.core.proto.MaterialObject3D;
     import org.papervision3d.materials.BitmapMaterial;
     import org.papervision3d.materials.utils.MaterialsList;
     import org.papervision3d.objects.DisplayObject3D;
     import org.papervision3d.objects.primitives.Plane;

     import org.papervision3d.cameras.FreeCamera3D;
     import org.papervision3d.render.BasicRenderEngine;
     import org.papervision3d.scenes.Scene3D;
     import org.papervision3d.view.Viewport3D;

     import org.papervision3d.materials.BitmapFileMaterial;
     import org.papervision3d.objects.primitives.Sphere;

     import org.papervision3d.events.InteractiveScene3DEvent;
     
     import org.papervision3d.objects.primitives.Cube;
     import org.papervision3d.materials.MovieAssetMaterial;
     import org.papervision3d.events.FileLoadEvent;
     
     /**
      * @PageName : cube
      * @author : Martin
      * @QQ : 183654371
      * @MSN : im@mococo.cn
     */
     
     public class cube extends Sprite
     {
           private var viewport:Viewport3D;
           private var renderer:BasicRenderEngine;
           private var scene:Scene3D;
           private var camera:FreeCamera3D;
           private var cuber:Cube;
           private var plane:Plane;
           private var do3d:DisplayObject3D;
           private var imtes:Object;
           private var yPos:Number = 0;
           private var numOfRotations:int = 2;
           private var anglePer:Number = 0;
           
           
           public function cube()
           {
                 addEventListener(Event.ADDED_TO_STAGE, init);
                 addEventListener(Event.REMOVED_FROM_STAGE, init);
           }
           
           private function init(e:Event):void
           {
                 
                 viewport = new Viewport3D(480, 320, true, true);
                 viewport.buttonMode = true;
                 renderer=new BasicRenderEngine();
                 scene = new Scene3D();
                 camera = new FreeCamera3D();
                 camera.zoom = 80;


                 addChild(viewport);
                 viewport.interactive=true;

                 var left:MovieAssetMaterial = new MovieAssetMaterial('cubemc', false);
                 var right:MovieAssetMaterial = new MovieAssetMaterial('cubemc', false);
                 var top:MovieAssetMaterial = new MovieAssetMaterial('cubemc', false);
                 var down:MovieAssetMaterial = new MovieAssetMaterial('cubemc', false);
                 var front:MovieAssetMaterial = new MovieAssetMaterial('cubemc', false);
                 var back:MovieAssetMaterial = new MovieAssetMaterial('cubemc', false);
                 
                 var materialist:MaterialsList = new MaterialsList();
                 materialist.addMaterial(left, 'left');
                 materialist.addMaterial(right, 'right');
                 materialist.addMaterial(top, 'top');
                 materialist.addMaterial(down, 'bottom');
                 materialist.addMaterial(front, 'front');
                 materialist.addMaterial(back, 'back');
                 cuber = new Cube(materialist, 100, 100, 100, 1, 1, 1);
                 scene.addChild(cuber);
                 
                 imtes = { };
                 do3d = new DisplayObject3D();
                 anglePer = ((Math.PI * 2) * numOfRotations) / 14;
                 for (var i:int = 1; i < 15 ; i ++ )
                 {
                       imtes[i] = { };
                       imtes[i].bfm = new BitmapFileMaterial('cube/' + i + '.jpg', false);
                       imtes[i].bfm.interactive = true;
                       imtes[i].bfm.name = 'bfm' + i;
                       imtes[i].bfm.addEventListener( FileLoadEvent.LOAD_COMPLETE , addContent );
                       imtes[i].bfm.oneSide = false;
                       imtes[i].bfm.smooth = true;
                 }
                 camera.lookAt(do3d);
                 scene.addChild(do3d);
                 addEventListener(Event.ENTER_FRAME,process);
           }
           
           private function onClick(e:InteractiveScene3DEvent):void
           {
                 trace('e: ' + e);
           }
           
           private function addContent(e:FileLoadEvent):void
           {
                 numLoaded ++;
                 plane = new Plane(e.currentTarget as MaterialObject3D, 130, 87, 2, 2);
                 trace(plane.name);
                 plane.x = Math.cos(numLoaded * anglePer) * 200;
                 plane.z = Math.sin(numLoaded * anglePer) * 200;
                 plane.y = yPos += 40;
                 plane.rotationY = ( -numLoaded * anglePer) * (180 / Math.PI) + 270;
                 trace(anglePer, numLoaded);
                 plane.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, onClick);
                 do3d.addChild(plane);
           }
           
           private var numLoaded:int = 0;
           
           private function process(evt:Event):void
           {
                 camera.orbitY(do3d, 2, 900, 100);
                 renderer.renderScene(scene, camera, viewport);
           }
     }
     
}
[/code]

flash 3d 研究所 kevinwong
(2008-12-17 17:37:12)
orbitY本身是不会卡的,你可以用最简单的场景试一试。
卡一般的原因是你某个物体的某个旋转转一周后被复位了。

flash 3d 研究所 小香猪
(2008-12-17 17:37:59)
建议把傻瓜包放到Google code上面更新,还可以加入更多的人进行修改,大家从SVN上更新更容易点。

flash 3d 研究所 DDM君
(2008-12-17 19:30:16)
呵呵,这个不可以哈,傻瓜包不过是pv3d加了点自己的修改而已 不能放google code的


flash 3d 研究所 E.P,
(2009-05-17 23:16:05)
太牛了··必须要感谢下··

flash 3d 研究所 DDM君
(2009-05-18 08:10:58)
呵呵,没事没事,欢迎光临
对了,我们的FlabCamera3D也可以用这个方法了哦,以后都用FlabCamera3D就可以了。

flash 3d 研究所 netsnower
(2009-05-18 11:42:40)
请问这个功能和camera.moveLeft(1)有什么区别。
直接使用camera.moveLeft(1)不是也可以绕中心点移动相机吗?


flash 3d 研究所 DDM君
(2009-05-18 23:11:16)
orbitY是靠三角运算得出来的位置

评论人:
邮   箱: (填入邮箱,博客地址均可)

内   容: (广告和垃圾内容可能会被删除,望理解)
链接地址

验证码:(为防止机器人骚扰,请麻烦输入验证码^_^)
  

(目前需登陆方可发表)


不想添加了