unity实现鼠标框选
来源:互联网 发布:苹果电脑画图软件 编辑:程序博客网 时间:2024/06/05 11:33
几次看见有人问框选物体的做法,之前斑竹也介绍过,用画的框生成的视椎,用经典图形学的视锥裁剪就能做到。
视锥裁剪资料学习:http://www.linuxgraphics.cn/graphics/opengl_view_frustum_culling.html
在unity里实现,其实很简单,因为有两个前提:
1.画的方框始终是在屏幕空间进行的,而屏幕空间其实就是摄像机的视锥空间的投射了,不需要另外计算视锥。
2.unity摄像机内建的功能,可以方便的把屏幕坐标和世界坐标互换。
这样最简单的画框选物体就简化成了:
1.用GL在屏幕空间动态画框。
2.把备选对象的transform.position用camera.WorldToScreenPoiont变换成屏幕坐标。
3.判断这些position的点是否落在画的方框之内,如果是就把对象切换到画边框的层,呈现选中效果。
一.屏幕动态画框
这个过程相对简单 就是在鼠标按下的时候记下鼠标位置,然后在鼠标移动时在当前鼠标位置和按下的位置之间画一个方形就行了。
效果如图:
注意GL绘图都是每帧进行的,所以不需要清除,直接不绘制方框就消失了。
二.判断物体是否选中
有了方框,要判断物体是否在方框内,按照经典的数学算法可以根据直线方程和点的坐标计算判断点在线的左边 右边 还是线上
空间平面方程可表示为:
Ax+By+Cz=0
对于点(x1, y1, z1),有
若 Ax1+By1+Cz1 = 0,则点在平面上;
若 Ax1+By1+Cz1 < 0,则点在平面的一侧;
若 Ax1+By1+Cz1 > 0,则点在平面的另一侧;
但是在这里,因为都是水平、垂直的线,我们并不需要考虑画斜线、曲线框选物体........,所以只需要简单的比大小就行了,土了那么一点但其实效率更高,毕竟作游戏不是算法比赛,怎么简单高效怎么用。
如果:物体的屏幕position.x >方框左下角.x && 物体的屏幕position.y >方框左下角.y && 物体的屏幕position.x <方框右上角.x && 物体的屏幕position.y <方框右上角.y, 那么这个物体就是在框选范围里了。至于z的判定,直接选择摄像机的near和far距离就行了,小于near大于far都无视。因为屏幕空间是左下角为0,0,判断是否在方框内要注意这个前提。
有Unity内置的世界坐标->屏幕坐标转换,其实根本不需要什么复杂的裁剪算法,也不需要搞一大堆参考物体,往外发射一堆射线什么的,一次坐标转换加6个判断条件的一条if语句,就完成全部选择逻辑了,简单高效。
效果如图:
注意这种判定是以物体的position点为基准,如果物体中心不在几何中心可能会有奇怪的效果,但对作游戏来说模型中心在几何中心是基本要求,所以应该不是问题。当然也可以按照部分顶点相交来选中,但是那样程序就会复杂很多,要先解构物体的mesh顶点,然后把顶点变换到屏幕坐标,然后判定是否在方框范围内。实际上对大多数游戏来说划过中心点算作选中条件完全可以满足,足够有说服力了。
附上一个自己作的小Demo,综合了之前的显示边缘光、轮廓效果,按钮遮罩效果,加上框选物体的效果。
鼠标左键按下画框 右键双击地面移动选中的群体 按住滚轮移动鼠标拖动地图,按住右键旋转鼠标转动视角,滚动滚轮缩放视角。
语音借用的是那啥3的人类语音,你懂的。
选择:
双击右键移动目标,目标用一组粒子显示,到达目标或者目标改变时自动消失
可以同时移动几组,有点像1代的C&C......
点按钮生成新的人物,选中按delete删除人物
鼠标划过显示边缘光,单击目标或者画框选中目标显示轮廓线
选中的目标会始终对着镜头,未选中的目标会随机行动
Unity的便利性显现无疑,基本无需复杂的几何、线代知识,也没有繁琐的外围代码,用几句判断语句搞定框选。加上所见即所得的集成开发环境,写到这样程度的Demo实际大概也就花了几个小时的人时,真正框选部分不超过1小时,有点像游戏开发的卡拉OK,优势确实很明显。
原文链接:http://blog.csdn.net/yuzhongyangood/article/details/8997284
视锥裁剪资料学习:http://www.linuxgraphics.cn/graphics/opengl_view_frustum_culling.html
在unity里实现,其实很简单,因为有两个前提:
1.画的方框始终是在屏幕空间进行的,而屏幕空间其实就是摄像机的视锥空间的投射了,不需要另外计算视锥。
2.unity摄像机内建的功能,可以方便的把屏幕坐标和世界坐标互换。
这样最简单的画框选物体就简化成了:
1.用GL在屏幕空间动态画框。
2.把备选对象的transform.position用camera.WorldToScreenPoiont变换成屏幕坐标。
3.判断这些position的点是否落在画的方框之内,如果是就把对象切换到画边框的层,呈现选中效果。
一.屏幕动态画框
这个过程相对简单 就是在鼠标按下的时候记下鼠标位置,然后在鼠标移动时在当前鼠标位置和按下的位置之间画一个方形就行了。
效果如图:
注意GL绘图都是每帧进行的,所以不需要清除,直接不绘制方框就消失了。
二.判断物体是否选中
有了方框,要判断物体是否在方框内,按照经典的数学算法可以根据直线方程和点的坐标计算判断点在线的左边 右边 还是线上
空间平面方程可表示为:
Ax+By+Cz=0
对于点(x1, y1, z1),有
若 Ax1+By1+Cz1 = 0,则点在平面上;
若 Ax1+By1+Cz1 < 0,则点在平面的一侧;
若 Ax1+By1+Cz1 > 0,则点在平面的另一侧;
但是在这里,因为都是水平、垂直的线,我们并不需要考虑画斜线、曲线框选物体........,所以只需要简单的比大小就行了,土了那么一点但其实效率更高,毕竟作游戏不是算法比赛,怎么简单高效怎么用。
如果:物体的屏幕position.x >方框左下角.x && 物体的屏幕position.y >方框左下角.y && 物体的屏幕position.x <方框右上角.x && 物体的屏幕position.y <方框右上角.y, 那么这个物体就是在框选范围里了。至于z的判定,直接选择摄像机的near和far距离就行了,小于near大于far都无视。因为屏幕空间是左下角为0,0,判断是否在方框内要注意这个前提。
有Unity内置的世界坐标->屏幕坐标转换,其实根本不需要什么复杂的裁剪算法,也不需要搞一大堆参考物体,往外发射一堆射线什么的,一次坐标转换加6个判断条件的一条if语句,就完成全部选择逻辑了,简单高效。
效果如图:
注意这种判定是以物体的position点为基准,如果物体中心不在几何中心可能会有奇怪的效果,但对作游戏来说模型中心在几何中心是基本要求,所以应该不是问题。当然也可以按照部分顶点相交来选中,但是那样程序就会复杂很多,要先解构物体的mesh顶点,然后把顶点变换到屏幕坐标,然后判定是否在方框范围内。实际上对大多数游戏来说划过中心点算作选中条件完全可以满足,足够有说服力了。
附上一个自己作的小Demo,综合了之前的显示边缘光、轮廓效果,按钮遮罩效果,加上框选物体的效果。
鼠标左键按下画框 右键双击地面移动选中的群体 按住滚轮移动鼠标拖动地图,按住右键旋转鼠标转动视角,滚动滚轮缩放视角。
语音借用的是那啥3的人类语音,你懂的。
选择:
双击右键移动目标,目标用一组粒子显示,到达目标或者目标改变时自动消失
可以同时移动几组,有点像1代的C&C......
点按钮生成新的人物,选中按delete删除人物
鼠标划过显示边缘光,单击目标或者画框选中目标显示轮廓线
选中的目标会始终对着镜头,未选中的目标会随机行动
Unity的便利性显现无疑,基本无需复杂的几何、线代知识,也没有繁琐的外围代码,用几句判断语句搞定框选。加上所见即所得的集成开发环境,写到这样程度的Demo实际大概也就花了几个小时的人时,真正框选部分不超过1小时,有点像游戏开发的卡拉OK,优势确实很明显。
原文链接:http://blog.csdn.net/yuzhongyangood/article/details/8997284
0 0
- unity实现鼠标框选
- unity--鼠标画线、画图实现
- unity--鼠标画线、画图实现
- Unity利用NGUI实现自定义鼠标
- Unity利用NGUI实现自定义鼠标
- Unity利用NGUI实现自定义鼠标
- Unity 实现鼠标拖动3D物体
- unity 实现鼠标对相机的操作
- unity鼠标跟随实现(ITween)
- unity实现鼠标点击后拖拽物体
- Unity物体跟随鼠标的实现
- Unity 代码实现物体跟随鼠标移动
- Unity 实现鼠标拖拽查看地图
- unity实现鼠标右键控制视角
- 【Unity】unity 鼠标画线
- unity实现鼠标拖拽缩放功能代码
- Unity使用Animator实现人物头部朝向鼠标
- unity实现鼠标点击位置小脚印标志
- Android高效加载大图、多图解决方案,有效避免程序OOM
- find the nth digit(数论)
- synchronized详解(三)
- 国外人对Qt的评价
- Android 中Webview 自适应屏幕
- unity实现鼠标框选
- 牛人的题目(位运算一)
- 调用COM组件服务器正在运行中解决方法
- GIT & REPO & GERRIT (二)
- C#网络编程(订立协议和发送文件) - Part.4
- MFC 视图分栏,分割窗口,在一个窗口设置对话框
- GIT & REPO & GERRIT (一)
- WINDOWS后台服务程序编写
- C++ 经典线程同步 事件Event示例解析(十)