简单的3D森林
package {
import flash.display.Sprite;
public class Tree extends Sprite {
public var xpos:Number = 0;
public var ypos:Number = 0;
public var zpos:Number = 0;
public function Tree() {
init();
}
public function init():void {
graphics.lineStyle(0, 0x00ff00); // 树的颜色
graphics.lineTo(0, -140 - Math.random() * 20); // 树干
graphics.moveTo(0, -30 - Math.random() * 30);
graphics.lineTo(Math.random() * 80 - 40, // 随机生成的树枝
-100 - Math.random() * 40);
graphics.moveTo(0, -60 - Math.random() * 40);
graphics.lineTo(Math.random() * 60 - 30,
-110 - Math.random() * 20);
}
}
}
------------------------------------------------------------------------------
// 利用简单树组成的森林
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
[SWF(backgroundColor=0x000000)]; // 设置背景为黑色,但不知为什么无效
public class Trees extends Sprite {
private var trees:Array; // 存放所有的树
private var numTrees:uint = 100; // 定义100颗够了
private var fl:Number = 250; // 屏幕距离眼睛一般设置为200--300
private var vpX:Number = stage.stageWidth / 2; // 物体太小后消失点
private var vpY:Number = stage.stageHeight / 2;
private var floor:Number = 50; // 水平面高度
private var vz:Number = 0; // Z轴透视深度速度
private var friction:Number = 0.98; // 阻尼系数
public function Trees() {
init();
}
private function init():void {
trees = new Array();
for (var i:uint = 0; i < numTrees; i++) {
var tree:Tree = new Tree(); // 生成树
trees.push(tree);
tree.xpos = Math.random() * 2000 - 1000;
tree.ypos = floor;
tree.zpos = Math.random() * 10000;
addChild(tree); //
}
addEventListener(Event.ENTER_FRAME, onEnterFrame);
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
}
private function onEnterFrame(event:Event):void {
for (var i:uint = 0; i < numTrees; i++) {
var tree:Tree = trees;
move(tree);
}
vz *= friction; // 阻尼后的Z轴方向的速度
sortZ(); // Z轴消隐
}
private function onKeyDown(event:KeyboardEvent):void { // 加减速控制
if (event.keyCode == Keyboard.UP) {
vz -= 1;
} else if (event.keyCode == Keyboard.DOWN) {
vz += 1;
}
}
private function move(tree:Tree):void {
tree.zpos += vz; // 更新移动距离(速度)
if (tree.zpos < -fl) { // 如果树走到眼睛后面,则移动到远处
tree.zpos += 10000;
}
if (tree.zpos > 10000 - fl) { // 如果树太远,大于屏幕外1000则移回
tree.zpos -= 10000;
}
var scale:Number = fl / (fl + tree.zpos); // 计算透视深度系数
tree.scaleX = tree.scaleY = scale;
tree.x = vpX + tree.xpos * scale;
tree.y = vpY + tree.ypos * scale;
tree.alpha = scale * .7 + .3; // 不同距离用不同的alpha混色,显示大气透视(朦胧感)
}
private function sortZ():void {
trees.sortOn("zpos", Array.DESCENDING | Array.NUMERIC);
for (var i:uint = 0; i < numTrees; i++) {
var tree:Tree = trees;
setChildIndex(tree, i);
}
}
}
}
简单的3D森林的更多相关文章
- ZAM 3D 制作简单的3D字幕 流程(二)
原地址:http://www.cnblogs.com/yk250/p/5663907.html 文中表述仅为本人理解,若有偏差和错误请指正! 接着 ZAM 3D 制作简单的3D字幕 流程(一) .本篇 ...
- SceneKit:简单的3D游戏场景搭建
SceneKit是Apple用来开发休闲3D游戏的框架,不同于底层的OpenGL库,你仅仅需要很少的代码就可以快速看到实际的3D场景效果.下面简单的聊聊搭建一个3D游戏场景需要做的事情. 首先你必须用 ...
- 如何制作简单的 3D 打印模型
Hi 大家好! 了解一个方兴未艾,但极为有趣的话题 — 3D 打印 . 为了帮助大家对3D打印有一个初步的感性认识,我在线制作了一款可用于3D打印的model, 大家可以先通过体验这个在线 model ...
- Python>>>创建一个简单的3D场景
首先安装PyOpengl pip install PyOpenGL PyOpenGL_accelerate
- ZAM 3D 制作简单的3D字幕 流程(一)
本文原地址-> http://www.cnblogs.com/yk250/p/5663048.html 效果参考图:请查阅 http://www.cnblogs.com/yk250/p/5662 ...
- 简单的3D图片轮播dome
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 一个简单的3D范例,是在别人基础上面整理的。
一个简单的范例,是在别人基础上面整理的.原来的例子,框图太乱了,没有条理感. http://pan.baidu.com/s/1eQTyGCE
- css3加js做一个简单的3D行星运转效果
前几天在园子里看到一篇关于CSS3D行星运转的文章,原文在这里,感觉这个效果也太酷炫了,于是自己也就心血来潮的来尝试的做了一下.因为懒得去用什么插件了,于是就原生的JS写,效果有点粗超,还有一些地方处 ...
- 简单的3d变换
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title> ...
随机推荐
- 在AD中设置漫游配置文件与文件夹重定向
在域环境下,域用户可以在域中的任意一台客户端计算机上登录,由于普通域用户的权限比较低,在大多数情况下只能对自己的用户配置文件具有完全控制权限,因而大多数域用户都是将数据直接保存在用户配置文件中.用户配 ...
- 括号匹配(POJ2955)题解
原题地址:http://poj.org/problem?id=2955 题目大意:给出一串括号,求其中的最大匹配数. 我这么一说题目大意估计很多人就蒙了,其实我看到最开始的时候也是很蒙的.这里就来解释 ...
- Java-根据经纬度计算距离(百度地图距离)
最近碰到一个需求,需要根据两个点的经纬度查询两点的距离.感觉以后还会用到,所以小记一波. 第一步:添加Maven依赖. <dependency> <groupId>org.ga ...
- last-child为啥不生效
last-child基本定义 指定属于其父元素的最后一个子元素的 p 元素的背景色 如果你这样写是不会生效的 <div class="limit-border"> &l ...
- SymPy解方程的实现
https://www.cnblogs.com/zgyc/p/6277562.html SymPy完全是用Python写的,并不需要外部的库 原理: 单纯用语言内置的运算与变量解决的是,由值求结果.如 ...
- linux中环境变量和系统加载环境变量的顺序
一.系统环境变量: /etc/profile :这个文件预设了几个重要的变量,例如PATH, USER, LOGNAME, MAIL, INPUTRC, HOSTNAME, HISTSIZE, uma ...
- C++11:基于std::queue和std::mutex构建一个线程安全的队列
C++11:基于std::queue和std::mutex构建一个线程安全的队列 C++中的模板std::queue提供了一个队列容器,但这个容器并不是线程安全的,如果在多线程环境下使用队列,它是不能 ...
- Ubuntu / CentOS 安装 Anaconda 并创建虚拟环境
Anaconda可以很好地帮我们管理Python的虚拟环境,Windows上操作极其方便,现在讲一下 Ubuntu 和 CentOS 上的使用方法 ubuntu 安装Anaconda版本 安装方法一: ...
- PAT 甲级 1086 Tree Traversals Again (25分)(先序中序链表建树,求后序)***重点复习
1086 Tree Traversals Again (25分) An inorder binary tree traversal can be implemented in a non-recu ...
- BUG处理流程图
流程描述: 1. 测试人员发现bug提交给开发. 2. 开发人员判断是否是bug. 3. 如果是bug,进行修改,修改完成后更改bug状态为已解决. 4. 如果不是bug,退回给测试人员并描述退回原因 ...