这几天一直在做摄影机系统,是一个关于GLScene的摄影机系统,怎么说呢,工作其实没有完成太好,我也很抱歉.但也发现在摄影机开发时多少注意的问题,如果你想让你的摄影机操作看上去那么自然的话.
大家都知道一个摄影机系统包含Up,Right,Look(Look向量可以通过LookAt-Position获得)向量.这三个向量相互影响。那在开发时候如何来更容易更好的把思路理清楚呢?我的处理办法是先固定一个向量的处理.我的摄影机系统里UP的默认值是(0,1,0),并且我的UP向量只会是这两个值,一个是UP,另一个是-UP,在做绕Right旋转的时候检测一下Camera的实时UP向量,当实时的UP向量和Camera的UP向量的夹角大于PI/2时候,将Camera的UP向量设置为-Up向量.
检测代码如下:
大家都知道一个摄影机系统包含Up,Right,Look(Look向量可以通过LookAt-Position获得)向量.这三个向量相互影响。那在开发时候如何来更容易更好的把思路理清楚呢?我的处理办法是先固定一个向量的处理.我的摄影机系统里UP的默认值是(0,1,0),并且我的UP向量只会是这两个值,一个是UP,另一个是-UP,在做绕Right旋转的时候检测一下Camera的实时UP向量,当实时的UP向量和Camera的UP向量的夹角大于PI/2时候,将Camera的UP向量设置为-Up向量.
检测代码如下:
procedure CheckUpVector;
//检测UP是否需要设置
var
temp : TVRVector;
//角度
AngleUp : Single;
begin
temp := TVRVector3.Create;
try
//将Right的值给temp
temp.Assign(Right);
//temp和Look叉乘
temp.CrossVector(Look);
//获得夹角
AngleUp := ArcCos(temp.DotVector(Up));
if AngleUp > VR_PI/2 then
Up.Invert;//将摄影机Up向量取反
finally
temp.Free;
end;
end;