立方体的着色,阴影效果,过度效果

本文介绍了一个使用Papervision3D实现的阴影着色立方体,并带有弹性过渡效果。该示例包括FlatShadeMaterial材质、GradientGlowFilter滤镜及随机旋转动画,适合初学者了解3D对象渲染。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

阴影着色的立方体外带过渡效果【附源码】

If you have been visiting this current incarnation of this site since opening day, you may remember that this little Flash-thing used to be part of the original version of the header.

It gave me numerous headaches primarily due to this problem, so I decided to remove it and publish the source instead.
It's really pretty basic - a cube primitive, a FlatShadeMaterial, a GradientGlowFilter, with some random elastic rotation done with Tweener - but I suspect that it could come very handy especially for those who are just starting with Papervision3D. Have fun with it.

Here's the source (of course you will need the Papervision3D Great White branch and Tweener to run it):

 
//  Shaded Papervision Cube with Tweener (C) edvardtoth.com
 
package 
{
 
    import flash.display.
*;
    import flash.events.
*;
    import flash.filters.GradientGlowFilter;
 
    import org.papervision3d.scenes.
*;
    import org.papervision3d.cameras.
*;
    import org.papervision3d.view.Viewport3D;
    import org.papervision3d.events.
*;
    import org.papervision3d.render.BasicRenderEngine;
    import org.papervision3d.lights.PointLight3D;
 
    import org.papervision3d.objects.
*;
    import org.papervision3d.objects.primitives.Cube;
 
    import org.papervision3d.materials.
*;
    import org.papervision3d.materials.utils.MaterialsList;
    import org.papervision3d.materials.shadematerials.FlatShadeMaterial;
 
    import caurina.transitions.Tweener;
 
    
public class ThreeDee extends MovieClip
    
{
        
private var effectWidth:Number = 300;  // because viewport has clipping turned off
        private var effectHeight:Number = 300;
 
        
private var glowFilter:GradientGlowFilter = new GradientGlowFilter (045, [0xf0f0f00xf0f0f00xf0f0f0], [00.51], [0x000x500xff], 66101"outer"false);
 
        
private var viewport:Viewport3D;
        
private var scene3d:Scene3D;
        
private var renderer:BasicRenderEngine;
          
private var display:DisplayObject3D;
        
private var object:Cube;
 
        
private var camera:FreeCamera3D;
        
private var pointLight:PointLight3D;
 
        
private var materials:MaterialsList;
        
private var flatShaderMat:FlatShadeMaterial;
 
        
private var rotXValue:Number;
        
private var rotZValue:Number;
        
private var rotYValue:Number;
        
private var limit:Number = 1.5;
 
        
public function ThreeDee ()
        
{
 
            stage.showDefaultContextMenu 
= false;
            stage.quality 
= StageQuality.MEDIUM;
            stage.scaleMode 
= StageScaleMode.NO_SCALE;
            stage.align 
= StageAlign.TOP_LEFT;
 
            
this.filters = [glowFilter];
 
            
// material
            flatShaderMat = new FlatShadeMaterial (pointLight, 0xde00000x800000);
            flatShaderMat.doubleSided 
= false;
 
            materials 
= new MaterialsList ();
            materials.addMaterial (flatShaderMat, 
"all");
 
            
// scene
            scene3d = new Scene3D();
            renderer 
= new BasicRenderEngine();
            camera 
= new FreeCamera3D(1600);
            viewport 
= new Viewport3D(effectWidth, effectHeight, falsefalsefalsefalse);
            display 
= new DisplayObject3D();
 
            
object = new Cube (materials, 300300300111);
 
            
// light
            pointLight = new PointLight3D (truefalse);  // 2nd would be true for collada
            pointLight.x = 200;
            pointLight.y 
= 0;
            pointLight.z 
= 500;
 
            display.addChild (
object);
            scene3d.addChild (display, 
"Display");
            scene3d.addChild (pointLight);
 
            addChild (viewport);
 
            rotXValue 
= randomize (0360);
            rotYValue 
= randomize (0360);
            rotZValue 
= randomize (0360);
 
            camera.rotationX 
= rotXValue;
            camera.rotationY 
= rotYValue;
            camera.rotationZ 
= rotZValue;
 
            updateFrame();
 
            recalcValues();
 
        }

 
        
private function updateFrame():void
        
{
            camera.x
=camera.y=camera.z=0;
 
            camera.moveBackward(
500);
 
            pointLight.copyPosition (camera);
            renderer.renderScene (scene3d, camera, viewport);
        }

 
        
private function recalcValues ():void
        
{
            rotXValue 
= randomize (0360);
            rotYValue 
= randomize (0360);
            rotZValue 
= randomize (0360);
 
            Tweener.addTween (camera, 
{rotationX:rotXValue, rotationY:rotYValue, rotationZ: rotZValue, onUpdate:updateFrame, onComplete:recalcValues, transition:"easeInOutElastic", time:3});
        }

 
        
private function randomize(min:Number, max:Number):Number
        
{
            
return (Math.random()*(max - min) + min);
        }

 
    }

 
}








Shaded Papervision cube with Tweener + source

If you have been visiting this current incarnation of this site since opening day, you may remember that this little Flash-thing used to be part of the original version of the header.
It gave me numerous headaches primarily due to this problem, so I decided to remove it and publish the source instead.
It's really pretty basic - a cube primitive, a FlatShadeMaterial, a GradientGlowFilter, with some random elastic rotation done with Tweener - but I suspect that it could come very handy especially for those who are just starting with Papervision3D. Have fun with it.

Here's the source (of course you will need the Papervision3D Great White branch and Tweener to run it):

 
// Shaded Papervision Cube with Tweener (C) edvardtoth.com
 
package {
 
import flash.display.*;
import flash.events.*;
import flash.filters.GradientGlowFilter;
 
import org.papervision3d.scenes.*;
import org.papervision3d.cameras.*;
import org.papervision3d.view.Viewport3D;
import org.papervision3d.events.*;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.lights.PointLight3D;
 
import org.papervision3d.objects.*;
import org.papervision3d.objects.primitives.Cube;
 
import org.papervision3d.materials.*;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.materials.shadematerials.FlatShadeMaterial;
 
import caurina.transitions.Tweener;
 
public class ThreeDee extends MovieClip
{
private var effectWidth:Number = 300; // because viewport has clipping turned off
private var effectHeight:Number = 300;
 
private var glowFilter:GradientGlowFilter = new GradientGlowFilter (0, 45, [0xf0f0f0, 0xf0f0f0, 0xf0f0f0], [0, 0.5, 1], [0x00, 0x50, 0xff], 6, 6, 10, 1, "outer", false);
 
private var viewport:Viewport3D;
private var scene3d:Scene3D;
private var renderer:BasicRenderEngine;
private var display:DisplayObject3D;
private var object:Cube;
 
private var camera:FreeCamera3D;
private var pointLight:PointLight3D;
 
private var materials:MaterialsList;
private var flatShaderMat:FlatShadeMaterial;
 
private var rotXValue:Number;
private var rotZValue:Number;
private var rotYValue:Number;
private var limit:Number = 1.5;
 
public function ThreeDee ()
{
 
stage.showDefaultContextMenu = false;
stage.quality = StageQuality.MEDIUM;
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
 
this.filters = [glowFilter];
 
// material
flatShaderMat = new FlatShadeMaterial (pointLight, 0xde0000, 0x800000);
flatShaderMat.doubleSided = false;
 
materials = new MaterialsList ();
materials.addMaterial (flatShaderMat, "all");
 
// scene
scene3d = new Scene3D();
renderer = new BasicRenderEngine();
camera = new FreeCamera3D(1, 600);
viewport = new Viewport3D(effectWidth, effectHeight, false, false, false, false);
display = new DisplayObject3D();
 
object = new Cube (materials, 300, 300, 300, 1, 1, 1);
 
// light
pointLight = new PointLight3D (true, false); // 2nd would be true for collada
pointLight.x = 200;
pointLight.y = 0;
pointLight.z = 500;
 
display.addChild (object);
scene3d.addChild (display, "Display");
scene3d.addChild (pointLight);
 
addChild (viewport);
 
rotXValue = randomize (0, 360);
rotYValue = randomize (0, 360);
rotZValue = randomize (0, 360);
 
camera.rotationX = rotXValue;
camera.rotationY = rotYValue;
camera.rotationZ = rotZValue;
 
updateFrame();
 
recalcValues();
 
}
 
private function updateFrame():void
{
camera.x=camera.y=camera.z=0;
 
camera.moveBackward(500);
 
pointLight.copyPosition (camera);
renderer.renderScene (scene3d, camera, viewport);
}
 
private function recalcValues ():void
{
rotXValue = randomize (0, 360);
rotYValue = randomize (0, 360);
rotZValue = randomize (0, 360);
 
Tweener.addTween (camera, {rotationX:rotXValue, rotationY:rotYValue, rotationZ: rotZValue, onUpdate:updateFrame, onComplete:recalcValues, transition:"easeInOutElastic", time:3});
}
 
private function randomize(min:Number, max:Number):Number
{
return (Math.random()*(max - min) + min);
}
 
}
 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值