![]() |
guke18410 (2010-02-03 15:11:14) |
程序方面的问题我还能提供点帮助 应该是addProjector()方法里某个对象没有获取到或者没有初始化 我不知道你用的是什么开发工具,如果能debug的话,看看出错在哪一行就明白了 |
![]() |
Jun天子 (2010-02-03 15:39:24) |
我用的是FLASH AS4 |
![]() |
Jun天子 (2010-02-03 15:43:38) |
我是想把这个类放进Wang这个总类里的 package { import flash.events.Event; import flash.events.MouseEvent; import flash.geom.Point; import flash.media.SoundTransform; import flash.media.Video; import flash.net.NetConnection; import flash.net.NetStream; import org.papervision3d.events.InteractiveScene3DEvent; import org.papervision3d.lights.PointLight3D; import org.papervision3d.materials.MovieMaterial; import org.papervision3d.materials.VideoStreamMaterial; import org.papervision3d.materials.shadematerials.FlatShadeMaterial; import org.papervision3d.materials.utils.MaterialsList; import org.papervision3d.objects.DisplayObject3D; import org.papervision3d.objects.primitives.Cube; import org.papervision3d.view.BasicView; public class TestVideoMat extends BasicView { public function TestVideoMat() { super(800,800,true,true); init3D(); } private var video:Video; private var light:PointLight3D; private var objGroup:DisplayObject3D; private var stream:NetStream; private var cb:Cube; private var prevPoint:Point=new Point(0,0); private var _yaw:Number; private var _pitch:Number; private var aim:DisplayObject3D; private var Flag=0; private function init3D():void { createVideo(); createLight(); camera.zoom=2; camera.focus=400; stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); startRendering(); } override protected function onRenderTick(event:Event=null):void { //cb.rotationY+=1; super.onRenderTick(event); } private function mouseDownHandler(evt:MouseEvent):void { prevPoint=new Point(evt.stageX,evt.stageY); stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler); } private function createVideo():void { var nc:NetConnection = new NetConnection(); nc.connect(null); stream=new NetStream(nc); stream.client = new Object(); video = new Video(); stream.play('rabbit.flv'); video.attachNetStream(stream); } private function createLight():void { light = new PointLight3D(); light.x=400; light.y=1000; light.z=-400; objGroup = new DisplayObject3D(); var _videoMat:VideoStreamMaterial=new VideoStreamMaterial(video,stream,false,true); addProjector(_videoMat); } private function addProjector( _videoMat:MovieMaterial ):void { var _flat:FlatShadeMaterial=new FlatShadeMaterial(light); _flat.interactive=true; var _matList:MaterialsList = new MaterialsList(); _matList.addMaterial(_flat,'all'); _matList.addMaterial(_videoMat,'front'); _matList.addMaterial(_videoMat,'back'); cb=new Cube(_matList,320,20,200); stage.addEventListener(MouseEvent.DOUBLE_CLICK,dClick); stage.doubleClickEnabled=true; cb.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK , clickHandle); scene.addChild(cb); scene.addChild(light); } private function dClick(event){ if(Flag==0){ Flag=1; cb.scaleX=1.5; cb.scaleY=1.5; }else{ Flag=0; cb.scaleX=1; cb.scaleY=1; }} private function clickHandle(e:InteractiveScene3DEvent):void { } private function mouseUpHandler(evt : MouseEvent):void { stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler); } private var cameraPitch:Number=0; private var cameraYaw:Number=0; private function mouseMoveHandler(evt : MouseEvent):void { var dPitch:Number = (evt.stageY - prevPoint.y) / 2; var dYaw:Number = (evt.stageX - prevPoint.x) / 2; if (cameraPitch==0) { cameraPitch=evt.stageY; } if (cameraYaw==0) { cameraYaw=evt.stageX; } cameraPitch-=dPitch; cameraYaw-=dYaw; prevPoint.x=evt.stageX; prevPoint.y=evt.stageY; trace(cameraPitch,cameraYaw); camera.orbit(cameraPitch, cameraYaw); } } } |
![]() |
guke18410 (2010-02-03 18:02:05) |
你的问题处在stage,这个对象是有些特殊的,在文档类中直接使用没有问题;但是非文档类,如果没有被加入到显示列表中,这个stage是null的,就出现了你碰到的问题。 一个解决办法:如果你的实现一定要用到stage的话,就把初始化动作延迟到构造方法之后,比如像这样: ... var testVideoMat:TestVideoMat = new TestVideoMat(); addChild(testVideoMat); testVideoMat.init3D(); ... 不过这样并不是好的设计,你可以考虑改变一下当前的实现方式 |
![]() |
DDM君 (2010-02-04 13:54:59) |
stage需要侦听是否已经作为父对象存在了。 |
![]() |
Jun天子 (2010-02-04 15:18:15) |
正如guke18410前辈就那么样把那么stage去掉就可以调用了,如果把那个鼠标事件用mouseDrager可不可以?不过我试过用了一下mouseDrager做出现下面错误1118: 属于 static 类型 org.papervision3d.core.proto:CameraObject3D 的值的隐式强制指令的目标可能是非相关类型 org.papervision3d.cameras:Camera3D。 不知道是不是和BasicView有关? |
![]() |
DDM君 (2010-02-04 22:15:18) |
mouseDrager有可能是这个问题, 总之,必须保证你用的摄像机参数是一个camera3D |
![]() |
Jun天子 (2010-02-04 23:03:24) |
DDM君能说下BasicView要怎么加入mouseDrager事件?我怎么看也看不出来那里出错了,BasicView不是BasicRenderEngine;Scene3D;Viewport3D;Camera3D这四个的集合吗?怎么我把BasicView变成这四个类,视频反而播放不了了,我本想用这四个类看能不能实现mouseDrager,没想到-_-! |
![]() |
Jun天子 (2010-02-07 17:09:58) |
视频面板问题终于解决了太开心了,多谢guke18410和DDM君 前辈的帮助^_^ |
![]() |
DDM君 (2010-02-08 13:28:44) |
basic view只要把默认的摄像机等等参数输入后,应该还是能用的。 其实我们研究所不鼓励basic view的原因是比较不容易帮助初学者理解需要生成的最基本的4要素,最好熟悉后,再使用basicview,这样换到其他引擎也很上手。 |
|
|