[Armory]實現相機的漫遊功能

通過Haxe腳本實現相機的移動和旋轉功能,參考代碼如下:

// 相機旋轉,設定lookAt目標示例
package arm;

import iron.math.Quat;
import iron.object.Object;
import iron.Scene;
import iron.math.Vec4;

class MyTrait extends iron.Trait {

	var cam: Object = null;
	var lookat = new Vec4(5, 5, 5);
    var q = new Quat();
    
	public function new() {
		super();

		notifyOnInit(function() {
			cam = Scene.active.getChild("Camera");
			lookat = Scene.active.getChild("Cube").transform.loc;
		});

		notifyOnUpdate(function() {
			var loc = cam.transform.loc;
			var angleXY = this.getAngleXY(lookat, loc);
			var angleZ = this.getAngleZ(lookat, loc);
            
			q.fromEuler(0.5*Math.PI+angleZ, 0, angleXY-0.5*Math.PI);
			cam.transform.rot.setFrom(q);

			cam.transform.buildMatrix();
		});

		// notifyOnRemove(function() {
		// });
	}

    // 計算繞Z軸旋轉的角度差
	private function getAngleXY(lookAt: Vec4, cameraLoc: Vec4) {
		var xd = Math.abs(lookAt.x - cameraLoc.x);
		var zd = Math.abs(lookAt.y- cameraLoc.y);
		var angle = 0.0;
	
		if (lookAt.x > cameraLoc.x) {
		  if (lookAt.y >= cameraLoc.y) {
			// quadrant 1
			angle = Math.atan2(zd, xd);
		  } else {
			// quadrant 4
			angle = 2 * Math.PI - Math.atan2(zd, xd);
		  }
		} else {
		  if (lookAt.y >= cameraLoc.y) {
			// quadrant 2
			angle = Math.PI - Math.atan2(zd, xd);
		  } else {
			// quadrant 3
			angle = Math.PI + Math.atan2(zd, xd);
		  }
		}
		return angle;
	}
   // 計算Z軸方向的角度差
	private function getAngleZ(lookAt: Vec4, cameraLoc: Vec4) {
		var dif = new Vec4().subvecs(lookAt, cameraLoc);
		var delZ = lookAt.z - cameraLoc.z;
		return Math.atan2(delZ, Math.sqrt(dif.x*dif.x+dif.y*dif.y));
	}
}

可以正常運行,不過在渲染過程中,似乎會出現場景閃爍的現象,歡迎大牛們指導指導。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章