ray与triangle/quad求交二三事
引擎中,ray与quad求交,算法未细看,但有求解二次方程,不解。
ray与triangle求交,使用的是97年经典算法,仔细看过论文,多谢小武同学指点,用到了克拉默法则求解线性方程组。
想模仿该方法,做ray与quad的求交,发现方程里不仅有u和v,还有uv,没法变换成线性方程组的形式。
本以为引擎中quad中四个点可以不共面,看过接口,不然,“不共面和退化的多边形不保证正确结果“。
而后又有两个问题,一是,与一个quad求交比与两个三角形求交快吗?二是,如果前面的问题答案为否,即两个三角形更快,为何不用两个三角形代替一个quad进行求交。
第一个问题,粗略计算了一下,quad不比两个triangle快(引擎中是这样)
第二个问题,quad有存储上的优势,首先索引值的存储,一个quad小于两个triangle,其次,mesh中,对于facevarying的变量,一个quad有四个,两个triangle有六个。
查阅资料,http://www.realtimerendering.com/intersections.html,这基本是比较全的求交算法集合。
链接里有与plane求交,但不够详细。
与quad求交的比较直接的办法,先求与面的交点,6次乘法求法向N,6次乘法求参数t。然后求出交点P(3次乘法),判断P是否在quad内部,最初使用的是http://www.cnblogs.com/graphics/archive/2010/08/05/1793393.html里面的重心法,判断点P是否是两个三角形内部。而后发现需要求交点的uv值,需要inverse bilinear interpolation(小武想到的关键词),找到方法http://stackoverflow.com/questions/808441/inverse-bilinear-interpolation,里面有求解二次方程(与前面所述引擎中类似),但目前还没遇到有两个解的情形。(乘法次数待统计)
最后,想到前面的三角形的uv值,论文中给出的是barycentric coordinates,而以前得出的结论是三角形uv值本质是退化的四边形的uv值(v从0到1的一条边退化成点),难道barycentric coordinates可以与之转化?
经验证以及阅读分析代码,发现三角形求交算法,将barycentric coordinates转化成了退化的四边形uv值,转化方法:u = u+v, v = u/(u+v)。
ray与triangle/quad求交二三事的更多相关文章
- 光线求交-面、三角形、球 (Ray intersection)
光线求交 光线定义:position \(a(t)\) = \(o\) + \(t\vec{d}\); 球定义: center p, radius r; 平面定义:normal \(\vec{n}\) ...
- 一步一步实现基于GPU的pathtracer(二):求交算法
不管是哪种全局光照算法,最根本的都要落实到光线与物体的求交.主要分为光线与参数曲面和非参数曲面的求交,典型的参数曲面有球.盒.圆柱等基本体及基本体的组合体,以及一些更为复杂的参数曲面.非参数曲面就是所 ...
- 【C#夯实】我与接口二三事:IEnumerable、IQueryable 与 LINQ
序 学生时期,有过小组作业,当时分工一人做那么两三个页面,然而在前端差不多的时候,我和另一个同学发生了争执.当时用的是简单的三层架构(DLL.BLL.UI),我个人觉得各写各的吧,到时候合并,而他觉得 ...
- [NetTopologySuite](2)任意多边形求交
任意多边形求交: private void btnPolygon_Click(object sender, EventArgs e) { , , , , , , , , , , , , , }; , ...
- Java并发编程二三事
Java并发编程二三事 转自我的Github 近日重新翻了一下<Java Concurrency in Practice>故以此文记之. 我觉得Java的并发可以从下面三个点去理解: * ...
- linux杂记(十二?) 关于账号和密码的二三事
关于密码的二三事 关于账号和密码的二三事 久了不更linux的相关知识,实在是懒得想内容点(纯粹是懒).那么今天就来谈谈关于linux密码和账号的重要概念. 假如你的主机遭到入侵,那么对方的第一个侵入 ...
- MySQL5.7关于密码二三事
MySQL5.7关于密码二三事 第一个:update user set password=password('root') where user='root' and host='localhost' ...
- Java中的匿名内部类及内部类的二三事
匿名内部类适合创建那些只需要使用一次的类,它的语法有些奇怪,创建匿名内部类会立即创建一个该类的实例,这个类定义立即消失,且不能重复使用. 定义匿名类的格式如下: new 实现接口() |父类构造器(实 ...
- HDU - 3982:Harry Potter and J.K.Rowling(半平面交+圆与多边形求交)(WA ing)
pro:给定一枚蛋糕,蛋糕上某个位置有个草莓,寿星在上面切了N刀,最后寿星会吃含有草莓的那一块蛋糕,问他的蛋糕占总蛋糕的面积比. sol:显然需要半平面交求含有蛋糕的那一块,然后有圆弧,不太方便求交. ...
随机推荐
- SQL 存储过程 解析XML
第一种说明: 我看过这样一篇文章,如下 在SQL Server2005中,微软延续了 2000中一个特性(即支持XML类型的数据),并加强了对XML 数据列.XML变量以及XML索引的支持 ...
- Could not load file or assembly or one of its dependencies. 试图加载格式不正确的程序。
当我把编译好的程序托管到IIS下后,访问时出现了以下问题,服务器环境是IIS 7,操作系统 Windows server 2008 r2 64位. 出现上述问题的原因是,所加载的程序集中有32位的,也 ...
- css实现强制不换行/自动换行/强制换行
在我们日常的编码中经常会遇到这段文字不可以换行,或者自动换行的需求.虽然这个功能在我们平时很常见但是我相信大家一定不会可以的去记住它吧(至少小月是很懒惰的从来是用什么查什么 ♦ 嘻嘻...).今天我们 ...
- react验证码倒计时
<!DOCTYPE html> <html> <head> <script src="../build/react.js">< ...
- 解析提高PHP执行效率的50个技巧
1.用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量, 单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的”函数”(译注:PHP手 ...
- 用HTML做的简单的个人简历
<html> <head> <title>table表格</title> <style type="text/css"> ...
- UAC在注册表中的对应位置
UAC在注册表中的对应位置 HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Policies/System 相关键值设置: U ...
- 几个实用的mysql函数
在工作中,处理数据时候往往使用php要废很多脑筋和写很多东西,如果不考虑代码的阅读性试试几个mysql的函数可以解决许多常见需求: 1.截取字符串函数: left() 从左开始截取字符串 right ...
- VS一次删除多个窗体后报错
今天在做项目的时候,需要删除多个窗体,删除了之后,VS报了个错误: 命名空间“项目名称”中不存在类型或命名空间名称“文件夹”(是否缺少程序集引用?) 具体原因不清楚,就算恢复窗体后还是一样的错误,无法 ...
- kudu playground
建表: CREATE TABLE my_first_table ( id BIGINT, name STRING ) TBLPROPERTIES( 'storage_handler' = 'com.c ...