Game
Junk
Action Scriopt
BBS
About Site
Link
Site Map
etc.
キューブ作り5
最後にキューブを回転させます。
まず光源とキューブを回転させて、それから映し出すという順番になります。
package { import flash.display.Sprite; import flash.events.TimerEvent; import flash.geom.Matrix3D; import flash.geom.Point; import flash.geom.Vector3D; import flash.utils.Timer; public class Cube extends Sprite { private var screen:Sprite = new Sprite(); private var shadingScreen:Sprite = new Sprite(); private var point:Vector.
= new Vector.
(8); private var face:Vector.
> = new Vector.
>(6);//面 private var color:Vector.
= new Vector.
(6);//色 private var eye:Vector3D = new Vector3D(-500,300,400);//視点 private var focus:Vector3D = new Vector3D();//焦点 private var light:Vector3D = new Vector3D( -500, 500, 500); private var brightness:Vector.
= new Vector.
(6); private var timer:Timer = new Timer(50); function Cube():void { point[0] = new Vector3D(50, -50, 50); point[1] = new Vector3D( -50, -50, 50); point[2] = new Vector3D( -50, 50, 50); point[3] = new Vector3D(50, 50, 50); point[4] = new Vector3D(50, -50, -50); point[5] = new Vector3D( -50, -50, -50); point[6] = new Vector3D( -50, 50, -50); point[7] = new Vector3D(50, 50, -50); face[0] = Vector.
([0, 1, 2, 3]); face[1] = Vector.
([3, 2, 6, 7]); face[2] = Vector.
([2, 1, 5, 6]); face[3] = Vector.
([5, 4, 7, 6]); face[4] = Vector.
([0, 3, 7, 4]); face[5] = Vector.
([0, 4, 5, 1]); color[0] = 0xff0000; color[1] = 0x00ff00; color[2] = 0x0000ff; color[3] = 0xffff00; color[4] = 0xff00ff; color[5] = 0x00ffff; screen.blendMode = "multiply"; addChild(shadingScreen); addChild(screen); timer.addEventListener(TimerEvent.TIMER, onTimer); timer.start(); } private function onTimer(e:TimerEvent):void { var m:Matrix3D = new Matrix3D(); m.appendRotation(-0.5, Vector3D.X_AXIS); m.appendRotation(1, Vector3D.Y_AXIS); m.appendRotation(-1.5, Vector3D.Z_AXIS); light = m.transformVector(light); m = new Matrix3D(); m.appendRotation(2, Vector3D.X_AXIS); m.appendRotation(-3, Vector3D.Y_AXIS); m.appendRotation(4, Vector3D.Z_AXIS); rotateCube(m); viewing(); } private function viewing():void { var p:Vector.
= affinTransform(); screen.graphics.clear(); shadingScreen.graphics.clear(); for (var i:int; i < face.length; i++) { if (hiddenCheck(i)) { drawSurface(i, p); } } } private function rotateCube(m:Matrix3D):void { for (var i:int; i < point.length; i++) { point[i] = m.transformVector(point[i]); } } //面を描画 private function drawSurface(f:int, p:Vector.
):void { screen.graphics.beginFill(color[f]); shadingScreen.graphics.beginFill(brightness[f]); var v:Point = p[face[f][3]]; screen.graphics.moveTo(v.x, v.y); shadingScreen.graphics.moveTo(v.x, v.y); for (var n:int; n < 4; n++) { v = p[face[f][n]]; screen.graphics.lineTo(v.x, v.y); shadingScreen.graphics.lineTo(v.x, v.y); } screen.graphics.endFill(); shadingScreen.graphics.endFill(); } //明るさ private function getBrightness(i:Number):uint { var b:int = int(0xff * (i / 2 + 0.5)); return (b << 16) + (b << 8) + b; } //陰面チェック private function hiddenCheck(f:int):Boolean { //面法線を求める var v1:Vector3D = point[face[f][0]].subtract(point[face[f][1]]); var v2:Vector3D = point[face[f][1]].subtract(point[face[f][2]]); var n:Vector3D = new Vector3D( v1.y * v2.z - v1.z * v2.y, v1.z * v2.x - v1.x * v2.z, v1.x * v2.y - v1.y * v2.x ); //視点から面の中心へのベクトルを求める var _x:int; var _y:int; var _z:int; var len:int = face[f].length; for (var i:int; i < len; i++) { _x += point[face[f][i]].x; _y += point[face[f][i]].y; _z += point[face[f][i]].z; } var o:Vector3D = new Vector3D(_x / len, _y / len, _z / len); var e:Vector3D = eye.subtract(o); if (n.x * e.x + n.y * e.y + n.z * e.z < 0) { var l:Vector3D = o.subtract(light); l.normalize(); n.normalize(); brightness[f] = getBrightness(n.x * l.x + n.y * l.y + n.z * l.z); return true; }else { return false; } } //透視変換 private function affinTransform():Vector.
{ var view:Vector3D = eye.subtract(focus);//視線 var sinA:Number = view.x / Math.sqrt(view.x * view.x + view.z * view.z); var cosA:Number = -view.z / Math.sqrt(view.x * view.x + view.z * view.z); var sinB:Number = -view.y / Math.sqrt(view.x * view.x + view.y * view.y + view.z * view.z); var cosB:Number = Math.sqrt(view.x * view.x + view.z * view.z) / Math.sqrt(view.x * view.x + view.y * view.y + view.z * view.z); var m:Matrix3D = new Matrix3D(Vector.
([ cosA, 0, -sinA, 0, 0, 1, 0, 0, sinA, 0, cosA, 0, 0, 0, 0, 1 ])); var m2:Matrix3D = new Matrix3D(Vector.
([ 1, 0, 0, 0, 0, cosB, sinB, 0, 0, -sinB, cosB, 0, 0, 0, 0, 1 ])); m.append(m2); m.prependTranslation( -eye.x, -eye.y, -eye.z); m.appendScale(1, 1, -1); var p:Vector.
= new Vector.
(point.length); for (var i:int; i < point.length; i++) { var affinPoint:Vector3D = m.transformVector(point[i]); p[i] = new Point(500 * affinPoint.x / affinPoint.z, 500 * affinPoint.y / affinPoint.z); } return p; } } }
実際に映し出すとこうなります。
キューブを作ろう
点を回転させる
視点から見た座標に
2次元の座標に
隠れている面を探す
面の明るさ
実際に作ってみる
点を決める
面を定義する
キューブを映す
キューブを回転
スポンサードリンク
Web検索
©sink100 All rights reserved.