在OpenGL中确定鼠标点击坐标在圆柱体范围内的方法有多种。一种常用的方法是使用投影和反投影矩阵。首先,你需要在渲染圆柱体之前设置投影矩阵,然后在鼠标点击事件中获取当前点击坐标。接下来,使用反投影矩阵将当前点击坐标转换为世界坐标。最后,计算当前点击坐标与圆柱体中心点之间的距离(只看x,y),并判断该距离是否小于圆柱体的半径,还需要在计算距离时考虑圆柱体的高度(只看z)。可以使用如下代码来判断点击坐标是否在圆柱体范围内:

普通算法

void onMouseClick(int x, int y) {// 获取当前点击坐标glm::vec4 viewport = glm::vec4(0, 0, window_width, window_height);glm::vec3 wincoord = glm::vec3(x, y, 0);glm::vec3 objcoord = glm::unProject(wincoord, view * model, projection, viewport);// 计算点击坐标与圆柱体中心点之间的距离float dx = objcoord.x - cylinder_center.x;float dy = objcoord.y - cylinder_center.y;float distance = sqrt(dx * dx + dy * dy);// 判断距离是否小于圆柱体半径if (distance < cylinder_radius) {// 判断高度是否在圆柱体高度范围内float cylinder_height = cylinder_top - cylinder_bottom;if (objcoord.z > cylinder_bottom && objcoord.z < cylinder_top) {// 点击坐标在圆柱体范围内std::cout << "Click inside cylinder" << std::endl;} else {std::cout << "Click outside cylinder" << std::endl;}} else {std::cout << "Click outside cylinder" << std::endl;}
}

需要注意的是,这里假定你已经知道了圆柱体的中心,半径,高度的顶部和底部,还有投影矩阵和视图矩阵。

用点到直线的距离来判断

对于圆柱体来说,应该用点到直线的距离来判断点是否在圆柱体范围内。
下面是一个示例代码,用来判断点击坐标是否在圆柱体范围内:

void onMouseClick(int x, int y) {// 获取当前点击坐标glm::vec4 viewport = glm::vec4(0, 0, window_width, window_height);glm::vec3 wincoord = glm::vec3(x, y, 0);glm::vec3 objcoord = glm::unProject(wincoord, view * model, projection, viewport);// 定义圆柱体的顶点和底点glm::vec3 top_vertex = glm::vec3(cylinder_center.x, cylinder_center.y, cylinder_top);glm::vec3 bottom_vertex = glm::vec3(cylinder_center.x, cylinder_center.y, cylinder_bottom);// 计算点击坐标到圆柱体轴线的距离glm::vec3 v = objcoord - bottom_vertex;glm::vec3 u = top_vertex - bottom_vertex;//轴线向量float d = glm::length(glm::cross(v, u)) / glm::length(u);// 判断距离是否小于圆柱体半径if (d <= cylinder_radius) {// 判断点是否在高度范围内if (objcoord.z > cylinder_bottom && objcoord.z < cylinder_top) {// 点击坐标在圆柱体范围内std::cout << "Click inside cylinder" << std::endl;} else {std::cout << "Click outside cylinder" << std::endl;}} else {std::cout << "Click outside cylinder" << std::endl;}
}

补充:点到直线距离计算公式1

需要注意的是,这里假定你已经知道了圆柱体的中心,半径,高度的顶部和底部,还有投影矩阵和视图矩阵。

还有,这段代码中的变量,需要您在调用之前预先定义和初始化,比如圆柱体的半径,中心,高度等。

此外,点击事件的处理可能因平台和框架而异,所以在实际应用中需要根据具体情况进行调整。

进一步完善

事实上,上面描述的是垂直放置的圆柱体,因此圆柱体高度的顶部和底部是确定的,但若是倾斜的圆柱体,需要知道顶部面和底部面的公式,随后用点到面的距离判断是否在范围内。
如果圆柱体是倾斜的,则需要知道顶部面和底部面的方程。点到面的距离可以使用点积运算来计算。您可以使用平面的法向量和一个点来描述平面。在求点到面的距离时,只需要把点代入平面方程来计算即可。

1.点到面的距离公式

例如:给定圆柱体顶面方程ax + by + cz + d = 0,点(x0,y0,z0)到圆柱体顶面的距离为:

distance = abs(ax0 + by0 + cz0 + d) / sqrt(aa + bb + cc)2

2.平面方程计算方法

可以通过已知的圆柱体顶面中心点和底面中心点来求出顶面和底面的法向量,再通过点乘法来计算出平面方程。这样就可以用点到平面的距离来判断点是否在圆柱体范围内了。
具体的实现方式如下:

  • 求出圆柱体顶面法向量: top_normal = normalize(top_center - bottom_center)
  • 求出点到顶面的距离: distance = dot(top_normal, objcoord - top_center)

如果需要求出底面的距离,只需要把top_center换成bottom_center就可以了

需要注意的是,这里假设你已经知道了圆柱体的顶部和底部的中心点,还有投影矩阵和视图矩阵。


  1. ↩︎


  2. 图片来自于百度,需要注意的是,这里po向量是垂直于平面的法向量,并不一定是这个长度 ↩︎

opengl中如何确定鼠标的点击坐标在一个圆柱体范围之内?相关推荐

  1. 怎样在python代码中输入π_鼠标自动点击、键盘自动输入?几行Python代码搞定

    相信我,你以后一定会用到.实在不行,你先收藏,做个收藏家,等拿出来,就值钱了. 第一步:安装并导入相关模块 只需要安装PyUserInput,如下: pip install PyUserInput 如 ...

  2. VC中鼠标移动点击操作

    实例: CPoint pointOld;GetCursorPos(&pointOld);CRect rect;GetDlgItem(IDCANCEL)->GetWindowRect(&a ...

  3. OpenGL中与鼠标相关的坐标系

    1.1鼠标坐标系 鼠标的初始坐标系是屏幕坐标系(Screen Coordinate System), 其原点在屏幕的左上角,x轴向右延伸,y轴向下延伸. 1.2窗口坐标系 窗口坐标系(Window C ...

  4. DW里面html鼠标点击特效,如何在Dreamweaver中设置手形鼠标样式效果

    如何在Dreamweaver中设置手形鼠标样式效果 1.按F7(或点击快速启动栏里那个象"八卦图"似的图标),调出CSS面板,选择"none",再点击面板下部的 ...

  5. Python记录鼠标的点击与拖拽时间并在文本文档中保存记录

    网上看到很多 python 关于记录鼠标操作轨迹的方法,很少提到关于时间的记录. 因为在写一个关于游戏的脚本,为了尽可能地还原真人鼠标操作防止封号,鼠标的点击的时间间隔是其中尤为重要的一点.代码监听了 ...

  6. Python中pyautogui安装-用pyautogui写脚本让鼠标自动点击给摩尔庄园毛毛树浇水施肥

    目录 pyautogui安装教程 脚本内容 pyautogui安装教程 在C盘搜索cmd.exe 右键点击"以管理员身份运行",打开后进入安装的python3.7目录,进入后输入& ...

  7. 关于在Opengl中先平移后旋转和先旋转后平移的效果不一样的原因

    一.现象 在OpenGL中先移动后旋转与先旋转后移动的最终效果是并不一定相同的,也就是说在Opengl中如果调用函数glTranslatef和函数glRotatef的次序不同,即使参数一样,效果也可能 ...

  8. OpenGL中常用的 GLUT 函数

    GLUT函数说明 一.初始化 void glutInit(int* argc,char** argv) 这个函数用来初始化GLUT库.对应 main 函数的形式应是: int main(int arg ...

  9. OpenGL程序之用鼠标实现橡皮筋技术

    OpenGL程序之用鼠标实现橡皮筋技术 前言 一.用鼠标实现橡皮筋技术的实现思路 如何感知鼠标的点击和移动 如何解决坐标对应的问题并使之显示在界面上 整体的逻辑 二.用鼠标实现橡皮筋技术的实现框架 1 ...

最新文章

  1. 58集团技术委员会主席:斗胆谈一谈,我是如何做到年薪百万的!!!
  2. 天下苦同行评审久矣,要不我们把它废除掉?
  3. orb 算法源码实现
  4. C++求解最大子序列和问题
  5. left edge algorithm.
  6. linux开发windows程序设计,X-win编程求助
  7. SAP Fiori : Response from creating in local store
  8. 板邓:wordpress自定义登录页面实现用户登录
  9. LeetCode 171. Excel表列序号(26进制转10进制)
  10. 牛客16500 珠心算测试
  11. win7 java jna找不到_java – 资源路径中找不到JNA本机支持(/com/sun/jna/linux-arm/libjnidispatch.so)...
  12. IBM AppScan 安全漏洞问题修复(.net)
  13. iPhone开发内存管理
  14. php 规则路由器,ThinkPHP6路由踩坑之变量规则
  15. java对excel加密_java 加密 excel
  16. Activiti7入门,Activiti7 数据库表结构详细解析
  17. 计算机不能上网查找原因的步骤,电脑能连接上wifi但不能上网的原因_电脑能连接上wifi但不能上网的解决方法...
  18. VMware虚拟机全屏状态下如何快速切换回原主机界面
  19. php sendmail 抄送,Python发送邮件各种姿势
  20. Java教程:如何使用Jib插件容器化SpringBoot应用?

热门文章

  1. Python版在图片上添加图片
  2. linux wifi让手机上网
  3. 苹果开发——Xcode证书生成、设置及应用
  4. 【每日面试】2021趣头条Java一面
  5. 跑步装备推荐:2022年跑步装备选购清单
  6. position:relative与position:absolute的定位区别
  7. Quartz Cron表达式 生成
  8. 复用标准手术衣说明书
  9. 刚做外贸,先做平台好还是独立站好?
  10. <机器学习>决策树理论