您的位置:首页 > 编程语言 > C#

OpenGL入门暨用C#做个3D吞食鱼(一)第一人称视角的实现

2013-04-26 10:35 337 查看
OpenGL入门暨用C#做个3D吞食鱼(一)第一人称视角的实现

废话少说先上图:

Stagger

private void Stagger(double staggerAngle)
{
if (openGLControl == null) return;

var ceX = this.center.X - this.eye.X;
var ceZ = this.center.Z - this.eye.Z;
var distanceCE = Math.Sqrt(ceX * ceX + ceZ * ceZ);
var diff = new TriTuple(distanceCE, this.center.Y - this.eye.Y, 0);
var cos = Math.Cos(staggerAngle);
var sin = Math.Sin(staggerAngle);
var centerDiff = new TriTuple(diff.X * cos - diff.Y * sin,
diff.X * sin + diff.Y * cos,
0);
this.center.Y = this.eye.Y + centerDiff.Y;
var percent = centerDiff.X / distanceCE;
this.center.X = this.eye.X + percent * ceX;
this.center.Z = this.eye.Z + percent * ceZ;
}


9. 高级目标

基本的前后左右上下移动和左右旋转前后翻转都实现了。虽然直接用键盘的KeyDown事件和鼠标的MouseDown、MouseMove、MouseUp事件就可以实现第一人称视角的移动了,但是还有不方便的地方:按住了前进键,再按向左移动键就不管用。就是说不能向左前方移动。

所以我们的高级目标就是要解决"组合移动"的问题。

先说前后左右上下移动。设计思路是:按下哪个方向键,就增加这个方向的标记,弹起哪个方向键,就去掉这个方向的标记;新增一个线程,每隔一个时间间隔(游戏世界里的Tick即可,一般游戏程序里都要有一个Tick的时间间隔开控制游戏速度)就根据当前标记的所有方向来计算新的视线,并Invoke窗口线程调用OpenGL.LookAt更新图像。

如下图表 10效果图中的center和中点投影所示,橙色矩形围起来的那个小箱子,就是center的位置,黑色矩形围起来的那个稍微大一点的箱子,是center和eye的中点在平面C上的投影(C是这么定义的:与Y轴垂直,且经过center点,如图表 11center和中点投影模型所示)。

PS:这个两个箱子大小其实是一样的,这里我们可以看到透视实现了近大远小的作用。



图表 10效果图中的center和中点投影



图表 11center和中点投影模型

至于左右旋转和前后翻转,本来就是组合着处理的,无需再做什么了。

完整工程源码在此:bitzhuwei.FeedingFrenzy.firstPersonPerspective.zip
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: