当前位置: 首页 > news >正文

用腾讯云服务器做网站重庆梁平网站制作公司

用腾讯云服务器做网站,重庆梁平网站制作公司,液体硅胶 技术支持 东莞网站建设,学做川菜最好的网站文章目录 背景openGL中的坐标转换简单的概念介绍 屏幕坐标转世界坐标openGL的实现filament通过射线拾取计算filament官方给出的转换方式filament实现坐标转换的QA1、View::pick()2、为什么filament的计算方式没有除以w分量#xff1f;3、为什么别的资料上都是inverse(viewMatr… 文章目录 背景openGL中的坐标转换简单的概念介绍 屏幕坐标转世界坐标openGL的实现filament通过射线拾取计算filament官方给出的转换方式filament实现坐标转换的QA1、View::pick()2、为什么filament的计算方式没有除以w分量3、为什么别的资料上都是inverse(viewMatrix * projectionMatrix) ?4、怎么判断这个世界坐标是不是在模型上也就是怎么判断是不是点击了模型 世界坐标转屏幕坐标矩阵运算 背景 模型渲染到屏幕上之后鼠标点击屏幕我们怎么知道是否点击了模型点击了模型的哪个位置呢 这些需求都需要坐标转换常规来说就是从世界坐标系转换到屏幕坐标系或者从屏幕坐标系转换到世界坐标系。 博主在渲染这块也是个新手大家一起学习。 本文使用的是google的filament渲染引擎。 openGL中的坐标转换 提起坐标转换就不得不提经典的openGL了可以参考以下文章 ModelMatrix、ModelViewMatrix、ProjectionMatrix、NormalMatrix模型矩阵、模型视图矩阵、投影矩阵、正规矩阵详解_妙为的博客-CSDN博客 经典渲染流程 坐标转换流程 简单的概念介绍 假定读者已经了解了基本的渲染知识我们这里不做过多解释毕竟不是重点。以下概念来源OpenGL矩阵变换的数学推导-腾讯云开发者社区-腾讯云 首先OpenGL有个世界坐标系我们渲染的物体就是在世界坐标系中我们的模型需要放到世界坐标系中那么当我们还没放的时候模型就和世界坐标系没有联系它就还处于自己的坐标系中我们叫做模型坐标系、局部空间、局部坐标系也就是图中的LOCAL SPACE。当我们把模型放到世界坐标系中模型就在世界坐标系里有了坐标也就是原来在LOCAL SPACE中的那些坐标值变成了世界坐标系中的坐标值帮助我们完成这个变换的就是模型矩阵对应图中的MODEL MATRIX于是这样我们就把模型放到了世界坐标系WORLD SPACE中放到世界坐标系后是不是就确定了我们渲染出来看到的样子还没有大家可以想像一下我把一个东西放在世界坐标系的某个地方我可以从近处看观察它也可以从远处观察它还可以从上下左右观察它甚至还可以倒着观察它因些还需要确定我们观察它的状态。OpenGL里帮我们虚拟出了一个Camera特别注意这里的Camera不是指我们硬件的Camera从API的层面上看我们只需要设置Camera的位置、朝向的点坐标、以及Camera的上方向向量就能将观察状态定下来而这些设置最终会转换成OpenGL中的视图矩阵对应图中的VIEW MATRIX -经过View Matrix的变换后我们观察它的结果就确定了图中是从距离它一定的距离、上往下观察它这时候的点坐标就来到了视图坐标系下对应图中的VIEW SPACE -这时候我们能看到什么东西基本已经确定了不过还有一步投影变换这是什么东西大家想像一下我们看到同一个东西是不是通常都是近大远小那么如何实现近大远小就要靠投影变换OpenGL提供正交投影和透视投影正交投影没有近大远小的效果不管在什么距离上看都一样大透视投影则有近大远小的效果也是符合我们实际生活的一种效果透视投影应用得比较多 还可以参考以下文章加深理解 ModelMatrix、ModelViewMatrix、ProjectionMatrix、NormalMatrix模型矩阵、模型视图矩阵、投影矩阵、正规矩阵详解_妙为的博客-CSDN博客 [OpenGL]OpenGL坐标系及坐标转换-腾讯云开发者社区-腾讯云 屏幕坐标转世界坐标 openGL的实现 上面的图让我们知道了渲染的矩阵变换从屏幕坐标到世界坐标其实就是反步骤来计算。例如顺序矩阵变化是viewMatrix * projectionMatrix那么求逆就是inverse(viewMatrix * projectionMatrix) 了。 可以参考stack overflow的回答https://stackoverflow.com/questions/46749675/opengl-mouse-coordinates-to-space-coordinates/46752492#46752492 通过逆矩阵的方式 mat4 inversePrjMat inverse( prjMat ); vec4 viewPosH inversePrjMat * vec4(ndc_x, ndc_y, 2.0*depth - 1.0, 1.0) vec3 viewPos viewPos.xyz / viewPos.w;filament通过射线拾取计算 https://github.com/google/filament/discussions/5998?sortnew 这种是不使用官方的pick()函数自己手写计算的射线拾取。这个issue主要存在的问题就是没有设置裁剪空间的w并且也没有除以w。 射线拾取参考屏幕坐标转世界坐标与射线生成 filament官方给出的转换方式 /*** screen space coordinates in GL convention, this can be used to compute the view or* world space position of the picking hit. For e.g.:* clip_space_position (fragCoords.xy / viewport.wh, fragCoords.z) * 2.0 - 1.0* view_space_position inverse(projection) * clip_space_position* world_space_position model * view_space_position** The viewport, projection and model matrices can be obtained from Camera. Because* pick() has some latency, it might be more accurate to obtain these values at the* time the View::pick() call is made.*/具体代码 // 1、获取clip_space_position const Viewport vp view-getViewport(); float clip_space_x (result.fragCoords.x / vp.width - 0.5f) * 2.0f; float clip_space_y (result.fragCoords.y / vp.height - 0.5f) * 2.0f; float clip_space_z result.fragCoords.z * 2.0f - 1.0f; float4 clip_space_position {clip_space_x, clip_space_y, clip_space_z, 1.0f};// 2、获取视图矩阵 mat4 projection camera.getProjectionMatrix(); mat4 model camera.getModelMatrix(); mat4 view_space_position model * inverse(projection); // 3、获取世界坐标系 float4 world_space_position clip_space_position * view_space_position;filament实现坐标转换的QA 1、View::pick() View::pick()会有延迟需要在pick()函数中获取模型矩阵投影矩阵进行计算。在pick()函数外获取投影矩阵是不准确的我踩的坑就是在pick()函数外获取的投影矩阵在使用的时候发现矩阵变化了导致inverse出来了inf和-nan等值。 inf 表示一个数超过了浮点类型所能表示的最大范围通常为正无穷或负无穷。 nan 表示一个数不是一个合法的数字通常出现在无法进行有效运算时。 2、为什么filament的计算方式没有除以w分量 剪辑空间是齐次坐标系转换成笛卡尔坐标系需要除以w,而我们设置的w是1.0当缩放坐标的W为1时坐标不会增大或缩小保持原有的大小。所以当W1不会影响到X,Y,Z分量的值。因此不影响最终结果。 什么是齐次坐标系?为什么要用齐次坐标系 3、为什么别的资料上都是inverse(viewMatrix * projectionMatrix) ? 在filament中viewMatrix inverse(getModelMatrix()) 所以 inverse(viewMatrix * projectionMatrix) inverse(viewMatrix) * inverse(projectionMatrix) getModelMatrix() * inverse(projectionMatrix) 参考https://stackoverflow.com/questions/66160973/finding-world-position-of-element-in-screen-space https://stackoverflow.com/questions/68870053/how-to-get-world-coordinates-from-the-screen-coordinates 4、怎么判断这个世界坐标是不是在模型上也就是怎么判断是不是点击了模型 filament中是通过pick()函数来实现的获取到点击位置对应的实体如果是模型的话就可以获取到模型对应实体的name。底层是调用了driver.readPixels()方法来从渲染目标缓冲区中读取相应的像素信息然后进行点击判断。 世界坐标转屏幕坐标 这部分的转换就是按照上面的渲染流程计算即可。 // 1、获取模型空间位置并将其转换为剪辑空间 vec4 clipSpacePos projectionMatrix * (viewMatrix * vec4(point3D, 1.0)); // 2、从剪辑空间转换到标准化设备坐标空间NDC 空间 vec3 ndcSpacePos clipSpacePos.xyz / clipSpacePos.w; // 3、获取窗口位置 vec2 windowSpacePos ((ndcSpacePos.xy 1.0) / 2.0) * viewSize viewOffset;参考https://stackoverflow.com/questions/8491247/c-opengl-convert-world-coords-to-screen2d-coords 矩阵运算 坐标转换离不开矩阵的运算建议是再回头看看线性代数。。没时间系统的看的话也可以先找一些网上的文章看看。以下几篇讲解的比较通俗可以看看。 线性代数的秘密矩阵相乘的本质是什么 讲一点点数学什么是矩阵 线性代数的秘密逆矩阵的意义是什么上 模型矩阵投影矩阵视图矩阵的推导 OpenGL矩阵变换的数学推导-腾讯云开发者社区-腾讯云 屏幕坐标转世界坐标与射线生成 end
http://www.zqtcl.cn/news/219437/

相关文章:

  • 连云港权威网站优化服务如何自己做解析网站
  • 学校网站建设调研报告wordpress update_post_meta
  • 法人变更在哪个网站做公示做企业平台的网站有哪些
  • 制作网站过程有免费的网站域名吗
  • 简单做网站用什么软件价格优惠
  • 在线自助下单网站建设银行上海分行招聘网站
  • 网站备案期间停止解析网站改版后 存在大量404页面
  • 朝阳网站建设 国展东莞常平邮政编码多少
  • 深圳网站建设微赢天下做视频网站服务器多少钱
  • 中小企业网站建设与管理课后答案wordpress主题 亚马逊
  • 网站制作关键技术上海网站建设收费
  • 深圳做互联网教网站公司集团管理软件
  • 华宁网站建设网站建设与维护新的体会
  • 网站后台清空北京网站建设厂家
  • 济南建设银行网站应用制作app软件
  • 网站开发实习个人小结关于做展厅的网站
  • 网站设计三把火如何制作动漫网站模板
  • 重庆做网站 哪个好些嘛开通qq空间申请网址
  • 制作网站 太原买的电脑没有wordpress
  • 图书馆建设投稿网站可信网站认证logo
  • 专做阀门网站网站如何做银联在线支付
  • 南通网站seo网页制作图片轮播
  • 高端品牌网站建设哪家好中医网站模板
  • 怎么做多语言网站图片添加文字在线制作
  • js特效演示网站wordpress本地视频
  • 徐州做网站哪个好上海国际人才网
  • 黑龙江省城乡和住房建设厅网站首页公司营业执照查询
  • 锦州北京网站建设支付公司网站建设会计分录
  • 泉州做网站优化价格软件公众号开发
  • 商丘旅游网站的建设攀枝花城市建设网站