? ?最近研究打算做個(gè)全景的Demo,發(fā)現(xiàn)Away3D本身的天空盒跟全景屬于兩種完全不同東西。最后只能基于HoverController來擴(kuò)展(原因是HoverController能提供的距離控制,類似拉近拉遠(yuǎn)的效果)等不夠好用。下面直接貼出擴(kuò)展的代碼,命名RotateController。
? ?其實(shí)也就是在HoverController的基礎(chǔ)上添加了對(duì)distance的距離判斷,添加了對(duì)負(fù)值的顯示控制..
package away3d.controllers
{
import
away3d.core.math.MathConsts;
import
away3d.core.render.PositionRenderer;
import
away3d.entities.Entity;
import
flash.geom.Matrix3D;
import
flash.geom.Vector3D;
public
class
RotateController
extends
ControllerBase
{
private
var
_distance:
Number
= 100
;
private
var
_panAngle:
Number
= 0
;
private
var
_tiltAngle:
Number
= 0
;
private
var
_currentTiltAngle:
Number
= 0
;
private
var
_currentPanAngle:
Number
= 0
;
public
function
RotateController(targetObject:Entity=
null
)
{
super
(targetObject);
}
override
public
function
update(interpolate:
Boolean
=
false
):
void
{
if
(_invalid) {
_invalid
=
false
;
if
(_panAngle < 0
) {
_currentPanAngle
+= _panAngle%360 + 360 -
_panAngle;
_panAngle
= _panAngle%360 + 360
;
}
else
{
_currentPanAngle
+= _panAngle%360 -
_panAngle;
_panAngle
= _panAngle%360
;
}
while
(_panAngle - _currentPanAngle < -180
)
_currentPanAngle
-= 360
;
while
(_panAngle - _currentPanAngle > 180
)
_currentPanAngle
+= 360
;
_currentPanAngle
=
_panAngle;
_currentTiltAngle
=
_tiltAngle;
if
(targetObject)
{
var
tempMatrix3d:Matrix3D =
targetObject.transform;
tempMatrix3d.identity();
tempMatrix3d.appendRotation(_currentTiltAngle, Vector3D.X_AXIS);
tempMatrix3d.appendRotation(_currentPanAngle, Vector3D.Y_AXIS);
var
pos:Vector3D =
new
Vector3D;
pos.x
= distance*Math.sin(_currentPanAngle*MathConsts.DEGREES_TO_RADIANS)*Math.cos(_currentTiltAngle*
MathConsts.DEGREES_TO_RADIANS);
pos.z
= distance*Math.cos(_currentPanAngle*MathConsts.DEGREES_TO_RADIANS)*Math.cos(_currentTiltAngle*
MathConsts.DEGREES_TO_RADIANS);
pos.y
= distance*Math.sin(_currentTiltAngle*
MathConsts.DEGREES_TO_RADIANS);
tempMatrix3d.appendTranslation(pos.x,
-
pos.y, pos.z);
targetObject.transform
=
tempMatrix3d;
}
}
}
public
function
get
distance():
Number
{
return
_distance;
}
public
function
set
distance(value:
Number
):
void
{
_distance
=
value;
_invalid
=
true
;
notifyUpdate();
}
public
function
get
panAngle():
Number
{
return
_panAngle;
}
public
function
set
panAngle(value:
Number
):
void
{
_panAngle
=
value;
_invalid
=
true
;
notifyUpdate();
}
public
function
get
tiltAngle():
Number
{
return
_tiltAngle;
}
public
function
set
tiltAngle(value:
Number
):
void
{
_tiltAngle
= Math.max(-90, Math.min(90
, value));
_invalid
=
true
;
notifyUpdate();
}
private
var
_invalid:
Boolean
=
false
;
}
}
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

