OpenGL入门暨用C#做个3D吞食鱼(一)第一人称视角的实现
2013-04-26 10:35
337 查看
OpenGL入门暨用C#做个3D吞食鱼(一)第一人称视角的实现
废话少说先上图:
Stagger
所以我们的高级目标就是要解决"组合移动"的问题。
先说前后左右上下移动。设计思路是:按下哪个方向键,就增加这个方向的标记,弹起哪个方向键,就去掉这个方向的标记;新增一个线程,每隔一个时间间隔(游戏世界里的Tick即可,一般游戏程序里都要有一个Tick的时间间隔开控制游戏速度)就根据当前标记的所有方向来计算新的视线,并Invoke窗口线程调用OpenGL.LookAt更新图像。
如下图表 10效果图中的center和中点投影所示,橙色矩形围起来的那个小箱子,就是center的位置,黑色矩形围起来的那个稍微大一点的箱子,是center和eye的中点在平面C上的投影(C是这么定义的:与Y轴垂直,且经过center点,如图表 11center和中点投影模型所示)。
PS:这个两个箱子大小其实是一样的,这里我们可以看到透视实现了近大远小的作用。
![](http://images.cnitblog.com/blog/383191/201304/26103838-1df3f5085118458da6f53b2990927187.png)
图表 10效果图中的center和中点投影
![](http://images.cnitblog.com/blog/383191/201304/26103840-73f921725aea4f068a9a821c67aa27c0.png)
图表 11center和中点投影模型
至于左右旋转和前后翻转,本来就是组合着处理的,无需再做什么了。
完整工程源码在此:bitzhuwei.FeedingFrenzy.firstPersonPerspective.zip
废话少说先上图:
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:这个两个箱子大小其实是一样的,这里我们可以看到透视实现了近大远小的作用。
![](http://images.cnitblog.com/blog/383191/201304/26103838-1df3f5085118458da6f53b2990927187.png)
图表 10效果图中的center和中点投影
![](http://images.cnitblog.com/blog/383191/201304/26103840-73f921725aea4f068a9a821c67aa27c0.png)
图表 11center和中点投影模型
至于左右旋转和前后翻转,本来就是组合着处理的,无需再做什么了。
完整工程源码在此:bitzhuwei.FeedingFrenzy.firstPersonPerspective.zip
相关文章推荐
- OpenGL学习:欧拉角实现第一人称相机(FPS camera with Euler angle)
- [OpenGL]使用简单的视角变化实现太阳和地球的转动
- 让camera实现类似cs第一人称视角旋转和位移
- C#如何实现url短地址?C#短网址压缩算法与短网址原理入门
- OpenCV(Emgu)入门系列(9):在C#中,使用Emgu+PictureBox实现一个简易的视频播放器
- thrift的用法入门,实现C#和java通信哦
- 用C#(入门) 双色球摇奖机 随机数实现
- OpenGL入门学习之九——使用混合来实现半透明效果
- 数值模拟实时三维可视化的C#与OpenGL实现
- C#入门学习-----推箱子游戏(WPF技术实现)
- C#入门10.3——接口的实现和继承(2)
- C#窗体程序入门,实现3秒倒计时关闭显示器,实现系统托盘,右键菜单。
- Visual C# 入门 -Office 编程(如何实现 - C#)
- C#入门之简单计算器的实现。
- getJson+ashx实现数据交互(入门级,c#)
- bgfx入门练习2——找出DX,OpenGL驱动切换实现原理
- C#入门10.4——显式实现接口
- c#入门系列——类和对象的代码实现
- C#(Mono)开发手机及平板应用入门篇(含WCF服务实现)
- C# 常用协议实现模版及FixedSizeReceiveFilter示例(SuperSocket入门)