FrustumClippingとCamera3D.target
Planeを倒して床を表現するとき、Planeがカメラに近いところでカリングされてしまう。
これを解消するために、レンダラのclippingをFrustumClippingにする。けど、カメラにtargetを指定しているとなんかFrustumClippingされてる領域がカメラを回す方向と逆にずれる。
仕方ないから、カメラにtargetを指定するのをやめて、カメラ位置を更新する毎にlookAt()してみる。
で、一応解決。
FrustumClippingクラスについては[PV3D2.0] FrustumClippingnote.xを参照。
最後のサンプルの「FrustumClippingして、lookAt()でカメラを振り向かせる」ソース。
- ActionScript
- CameraTargetWithFrustumClipping.as
- Source
package
{
import flash.display.Sprite;
import flash.events.Event;
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.core.clipping.FrustumClipping;
import org.papervision3d.materials.ColorMaterial;
import org.papervision3d.materials.special.CompositeMaterial;
import org.papervision3d.materials.WireframeMaterial;
import org.papervision3d.objects.primitives.Cone;
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.view.Viewport3D;
[SWF(backgroundColor = 0x000000, width = 600, height = 400, frameRate = 30)]
public class CameraTargetWithFrustumClipping extends Sprite
{
private var _render:BasicRenderEngine;
private var _scene:Scene3D;
private var _camera:Camera3D;
private var _viewport:Viewport3D;
private var _floor:Plane;
private var _cone:Cone;
private var _cameraRadius:Number;
private var _cameraAngle:Number;
public function CameraTargetWithFrustumClipping()
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
}
private function onAddedToStage(e:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
init();
}
private function init():void
{
var colorMaterial:ColorMaterial = new ColorMaterial(0x0099CC);
var wireframeMaterial:WireframeMaterial = new WireframeMaterial(0x00CCFF);
var compositeMaterial:CompositeMaterial = new CompositeMaterial();
compositeMaterial.addMaterial(colorMaterial);
compositeMaterial.addMaterial(wireframeMaterial);
init3D();
initFloor(compositeMaterial);
initCone(compositeMaterial);
initEvent();
}
private function init3D():void
{
_cameraRadius = 1000;
_cameraAngle = 0;
_render = new BasicRenderEngine();
_render.clipping = new FrustumClipping(FrustumClipping.ALL);
_scene = new Scene3D();
_camera = new Camera3D();
_viewport = new Viewport3D(stage.stageWidth, stage.stageHeight);
addChild(_viewport);
}
private function initFloor(compositeMaterial:CompositeMaterial):void
{
_floor = new Plane(compositeMaterial, 2000, 2000, 4, 4);
_floor.rotationX = 90;
_floor.y = -350;
_scene.addChild(_floor);
}
private function initCone(compositeMaterial:CompositeMaterial):void
{
_cone = new Cone(compositeMaterial, 300, 400);
//_camera.target = _cone; // _camera.target を使うのをやめて
_scene.addChild(_cone);
}
private function initEvent():void
{
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function onEnterFrame(e:Event):void
{
_cameraAngle += Math.PI / 180 * 3;
_camera.x = _cameraRadius * Math.cos(_cameraAngle);
_camera.z = _cameraRadius * Math.sin(_cameraAngle);
_camera.lookAt(_cone); // _camera.lookAt() を使う
render();
}
private function render():void
{
_render.renderScene(_scene, _camera, _viewport);
}
}
}- package
- {
- import flash.display.Sprite;
- import flash.events.Event;
- import org.papervision3d.cameras.Camera3D;
- import org.papervision3d.core.clipping.FrustumClipping;
- import org.papervision3d.materials.ColorMaterial;
- import org.papervision3d.materials.special.CompositeMaterial;
- import org.papervision3d.materials.WireframeMaterial;
- import org.papervision3d.objects.primitives.Cone;
- import org.papervision3d.objects.primitives.Plane;
- import org.papervision3d.render.BasicRenderEngine;
- import org.papervision3d.scenes.Scene3D;
- import org.papervision3d.view.Viewport3D;
- [SWF(backgroundColor = 0x000000, width = 600, height = 400, frameRate = 30)]
- public class CameraTargetWithFrustumClipping extends Sprite
- {
- private var _render:BasicRenderEngine;
- private var _scene:Scene3D;
- private var _camera:Camera3D;
- private var _viewport:Viewport3D;
- private var _floor:Plane;
- private var _cone:Cone;
- private var _cameraRadius:Number;
- private var _cameraAngle:Number;
- public function CameraTargetWithFrustumClipping()
- {
- if (stage) init();
- else addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
- }
- private function onAddedToStage(e:Event):void
- {
- removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
- init();
- }
- private function init():void
- {
- var colorMaterial:ColorMaterial = new ColorMaterial(0x0099CC);
- var wireframeMaterial:WireframeMaterial = new WireframeMaterial(0x00CCFF);
- var compositeMaterial:CompositeMaterial = new CompositeMaterial();
- compositeMaterial.addMaterial(colorMaterial);
- compositeMaterial.addMaterial(wireframeMaterial);
- init3D();
- initFloor(compositeMaterial);
- initCone(compositeMaterial);
- initEvent();
- }
- private function init3D():void
- {
- _cameraRadius = 1000;
- _cameraAngle = 0;
- _render = new BasicRenderEngine();
- _render.clipping = new FrustumClipping(FrustumClipping.ALL);
- _scene = new Scene3D();
- _camera = new Camera3D();
- _viewport = new Viewport3D(stage.stageWidth, stage.stageHeight);
- addChild(_viewport);
- }
- private function initFloor(compositeMaterial:CompositeMaterial):void
- {
- _floor = new Plane(compositeMaterial, 2000, 2000, 4, 4);
- _floor.rotationX = 90;
- _floor.y = -350;
- _scene.addChild(_floor);
- }
- private function initCone(compositeMaterial:CompositeMaterial):void
- {
- _cone = new Cone(compositeMaterial, 300, 400);
- //_camera.target = _cone; // _camera.target を使うのをやめて
- _scene.addChild(_cone);
- }
- private function initEvent():void
- {
- addEventListener(Event.ENTER_FRAME, onEnterFrame);
- }
- private function onEnterFrame(e:Event):void
- {
- _cameraAngle += Math.PI / 180 * 3;
- _camera.x = _cameraRadius * Math.cos(_cameraAngle);
- _camera.z = _cameraRadius * Math.sin(_cameraAngle);
- _camera.lookAt(_cone); // _camera.lookAt() を使う
- render();
- }
- private function render():void
- {
- _render.renderScene(_scene, _camera, _viewport);
- }
- }
- }
About this entry
You’re currently reading “FrustumClippingとCamera3D.target,” an entry on jp.ferv.blog
- Published:
- Thu, Jun 4th, 2009 at 3:51 PM
- Author:
- dsk
- Category:
- Web
- Tags:
- ActionScript 3.0, Papervision3D



No comments
Jump to comment form | comments rss | trackback uri