OpenTK中,对模型进行取点时,有什么好的方法吗?

OpenTK 2024-12-04 16:19:27

1.通过深度取点,再通过逆矩阵获得模型的原始坐标。 
GL.ReadPixels(x, glc.Height - y, 1, 1, PixelFormat.DepthComponent, PixelType.Float, depth);
缺陷就是对精度要求比较高,可能要点击多次才能取到一个点。
为此,我设置一个阀值k,将逆矩阵获得的坐标点P0与原始坐标集合去比较,
如果在集合内,则取点成功。如果不在,取与这个点距离<k的最近的一个点。但是取最近的点,偶尔会与鼠标的箭头相差太远。有什么优化的方法吗

2.通过颜色取点,对每一个点按顺序渲染一个不同的颜色,然后通过颜色去原始坐标集合中去找对应的点
 GL.ReadPixels(x, glc.Height - y, 1, 1, PixelFormat.Rgba, PixelType.UnsignedByte, pixels);
缺陷就是会把模型弄的五颜六色的。

以上方法有什么优化的点吗?或者有没有其他的方法能更好的取点呀?

...全文
214 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
OpenTK 2024-12-05
  • 打赏
  • 举报
回复

经指点,采用了另外一种方法,这里称为方法3,将所有的原始坐标集合List转换成变换后的坐标集合ListA,从中找出与屏幕的x,y距离最近的点。
之前想过这种方法,当时想着取最近的四个点再做处理,还考虑到Z值问题。故而放弃了,现在想想,不需要对Z值进行考虑。
这种方法对相对于方法1,误差率从0.8降到了0.01,相对更加方便。
但缺点是,每次变换后的坐标集合ListA都需要重新计算,数据过大的话可能会比较耗时。目前采用字典的形式储存数据,后续再优化。

ts237 2024-12-13
  • 举报
回复
@OpenTK 您好,我最近刚学opentk,也到了取点这一步,z值如何考虑进去了
OpenTK 2024-12-13
  • 举报
回复
@ts237 你好,Z值取点逻辑如下 1.将屏幕点的X、Y坐标转换为NDC坐标系(Xn,Yn) 2.通过ReadPixels方法获取Z轴的值z(需要开启深度测试),因为在NDC坐标系Z轴范围也是-1~1,需要转换成 Zn=2*z - 1 3.将这个点的坐标(Xn,Yn,Zn)*变换矩阵的逆矩阵,得到这个点在原始的坐标点的位置Vctor3A(Xo,Yo,Zo) 4.然后遍历判断原来的坐标集合,判断点Vctor3A是否在坐标系中,或者是否与该点的距离小于误差值k 5.如果符合条件,认为取点成功 可以优化的地方,一个是原始数据的储存结构,看看是否用八叉树等结构更好, 另外一个就是获取Zn的方式是否可以优化,有兴趣可以试试哈 也欢迎加入社区一起讨论相关技术问题
ts237 2024-12-17
  • 举报
回复
@OpenTK // 计算屏幕坐标到标准化设备坐标的转换 float normX = (screenX - viewport[0]) / viewport[2]; float normY = (screenY - viewport[1]) / viewport[3]; // 将Y轴翻转,因为OpenGL的坐标系统在Y轴上是反向的 normY = 1.0f - normY; // 计算NDC坐标 ([-1, 1]) float ndcX = normX * 2.0f - 1.0f; float ndcY = normY * 2.0f - 1.0f; float ndcZ = depth * 2.0f - 1.0f; // 计算模型视图和投影矩阵的乘积的逆矩阵 Matrix4 mvp = projection * modelview; Matrix4 invMVP = Matrix4.Invert(mvp); // 反投影到世界坐标 Vector4 worldCoords = new Vector4(ndcX, ndcY, ndcZ, 1.0f); // 使用 Matrix4.Transform 进行矩阵与向量的乘法 worldCoords = invMVP * worldCoords; // 返回转换后的世界坐标 return new Vector3(worldCoords.X, worldCoords.Y, worldCoords.Z);是这样做的,但为什么z的坐标感觉不对,我点集合里z都是0的
2条回复

3

社区成员

发帖
与我相关
我的任务
社区描述
openTK、OpenGL、WebGL技术学习交流
图形渲染c#程序人生 技术论坛(原bbs) 广东省·深圳市
社区管理员
  • 亿只小灿灿
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧