PN三角形(Curved PN Triangles)
文章来源于
Curved PN Triangles ——Vlachos , Alex , Peters , rg , Boyd
现在已经是一种很成熟的图形渲染方法了(在这之前我都不知道顶点法向有什么用23333),其大致思路是在已有的控制顶点和法向的基础上插入新的控制顶点和控制法向,利用bezier三角形分片绘制,加上顶点法向的效果将其做更好的渲染。
算法描述
来自
PN 三角形在基于GPU 曲面细分中的应用 ——陈 驰,吴志红
PN 三角形与贝塞尔三角形
贝塞尔三角形是一种特殊的贝塞尔曲面,它通过控制点和质心坐标信息来确定三次曲面上的点的位置,而PN 三角形又是贝塞尔三角形的一种特殊的实现,即PN 三角形的控制点信息是依据输入三角形的顶点位置信息和法线信息计算求得,而它的质心坐标则是通过细分着色器来进行插值并输出。
几何控制点
输入渲染管线中的三角面片的信息以顶点为单位,如图2所示,P1P_1~P3P_3是输入顶点的位置信息,N1N_1 ~ N3N_3是输入顶点的法线信息,基于这些信息可求得控制点信息。如图3 所示,一个三角面片共有10个控制点,其中b003b_{003},b300b_{300},b030b_{030}是原三角形的 3 个顶点,而其余的7 个控制点则是依据顶点和法线信息插入的,之后根据控制点信息和细分着色器输出的质心坐标信息共同计算出插入点的位置。
控制点的计算
1) 如图4所示,bijkb_{ijk}所对应的三角面片上的插入点P0=iP1+jP2+kP33P_0=\frac{iP_1+jP_2+kP_3}{3};
2) 距P0P_0点最近的顶点作为一个平面中的点,以该顶点的法线为该平面的法线;
3) P0P_0点在上述平面上的投影即为所求的控制点 bijkb_{ijk} 。
求 b210b_{210}的过程为:首先计算插入点 P0P_0,其中,i=2,j=1,k=0i=2,j=1,k=0,之后找到点P1P_1和它的法线 N1N_1所对应的平面,最后将点P0P_0投影到前述的平面上,即可得到控制点b210b_{210}。控制点的求法类似,而b111b_{111}则有些特别,求法为:E=b210+b120+b021+b012+b102+b2016E=\frac{b_{210}+b_{120}+b_{021}+b_{012}+b_{102}+b_{201}}{6} ,V=P1+P2+P33V=\frac{P_1+P_2+P_3}{3},b111=E+E−V2b_{111}=E+\frac{E-V}{2}。b111b_{111}的值是E 加上从V 到E 向量方向的偏移的结果。
法线控制点
PN 三角形共有6 个法线控制点(如图5 所示),其中顶点处的3 个为顶点的法线向量,而n110,n011,n101n_{110},n_{011},n_{101}则是插入的控制点信息,这些控制点信息和细分后的质心坐标共同影响着新顶点的法线向量的插入结果。法线向量的插入可以选择线性的,也可以选择二次的,鉴于PN 三角形点的插入是三次的(即曲面的),而法线向量又是对曲面方程求偏导数的结果,因而选法线的二次插入。
基于面法线的渲染中三角面片之间的法线过渡是离散的,所以需要插入法线,如果是简单的线性插入,所
插入的法线信息可能不能反映法线反射的情况。比如,起始点和终止点的法线向量的方向相同,则在这之间插入的所有法线向量的方向与起始点和终止点的方向相同,但实际情况可能是,起始点和终止点之间的曲线可能是类似于正弦曲线的形状,而在这种情况下,所插入的法线向量的方向显然不是全都相同的。
基于上述原因,在求法线控制点时考虑镜面映射,如图 6 所示, n110n_{110}为向量 N1+N22\frac{N_1+N_2}{2}相对于垂直于向量 P1,P2P_1,P_2 的平面的镜面映射,向量 P1,P2P_1,P_2 是上述平面的法线向量,但还没有规格化,有了平面上的点 P1+P22\frac{P_1+P_2}{2}和平面的法线向量, n110n_{110}很容易通过 N1+N22\frac{N_1+N_2}{2}相对于平面法线的投影求出。设 N1+N22\frac{N_1+N_2}{2}在 P1,P2P_1,P_2 上的投影为向量 HH,则n110=N1+N22−2Hn_{110}=\frac{N_1+N_2}{2}−2H 。
注意在这步之前的三点法向要 单位化,之后的法向也要相应的单位化
Berzier三角形
在上面的做完了之后,分别按照三次和二次Bezier三角形曲面绘制即可
算法实现及实验效果
算法实现
求控制顶点和法向的代码如下
function [ control_new,N_new ] = tran_1to22( controls,N)
%TRAN_1TO2 Summary of this function goes here
% Detailed explanation goes here
% 1,1
% / \
% 2,1--2,2
% / \ / \
% 3,1 --3,2-- 3,3
% / \ / \ / \
% 4,1--4,2-- 4,3 --4,4control_new=cell(4,4);
control_new{1,1}=controls{1,1};
control_new{4,1}=controls{2,1};control_new{4,4}=controls{2,2};point12_out=2/3*controls{1,1}+1/3*controls{2,1};
control_new{2,1}=compute_nearest_point_on_surface2(controls{1,1},N(1,:),point12_out);
point21_out=1/3*controls{1,1}+2/3*controls{2,1};
control_new{3,1}=compute_nearest_point_on_surface2(controls{2,1},N(2,:),point21_out);point13_out=2/3*controls{1,1}+1/3*controls{2,2};
control_new{2,2}=compute_nearest_point_on_surface2(controls{1,1},N(1,:),point13_out);
point31_out=1/3*controls{1,1}+2/3*controls{2,2};
control_new{3,3}=compute_nearest_point_on_surface2(controls{2,2},N(3,:),point31_out);point23_out=2/3*controls{2,1}+1/3*controls{2,2};
control_new{4,2}=compute_nearest_point_on_surface2(controls{2,1},N(2,:),point23_out);
point32_out=1/3*controls{2,1}+2/3*controls{2,2};
control_new{4,3}=compute_nearest_point_on_surface2(controls{2,2},N(3,:),point32_out);E=1/6*(control_new{2,1}+control_new{3,1}+control_new{2,2}+control_new{3,3}+control_new{4,2}+control_new{4,3});
V=1/3*(control_new{1,1}+control_new{4,1}+control_new{4,4});
control_new{3,2}=E+1/2*(E-V);for i=1:3
S=sqrt(N(i,1)^2+N(i,2)^2+N(i,3)^2);
N(i,1)=N(i,1)/S;
N(i,2)=N(i,2)/S;
N(i,3)=N(i,3)/S;
endN_new=zeros(6,3);
N_new(1,:)=N(1,:);
N_new(4,:)=N(2,:);
N_new(6,:)=N(3,:);pn12=point12_out+0.5*(N(1,:)+N(2,:));
pn12sur=compute_nearest_point_on_surface2(point12_out,controls{1,1}-controls{2,1},pn12);
pn12_2=2*pn12sur-pn12;
N_new(2,:)=pn12_2-point12_out;pn13=point13_out+0.5*(N(1,:)+N(3,:));
pn13sur=compute_nearest_point_on_surface2(point13_out,controls{1,1}-controls{2,2},pn13);
pn13_2=2*pn13sur-pn13;
N_new(3,:)=pn13_2-point13_out;pn23=point23_out+0.5*(N(2,:)+N(3,:));
pn23sur=compute_nearest_point_on_surface2(point23_out,controls{2,1}-controls{2,2},pn23);
pn23_2=2*pn23sur-pn23;
N_new(5,:)=pn23_2-point23_out;for i=1:6
S=sqrt(N_new(i,1)^2+N_new(i,2)^2+N_new(i,3)^2);
N_new(i,1)=N_new(i,1)/S;
N_new(i,2)=N_new(i,2)/S;
N_new(i,3)=N_new(i,3)/S;
endend
然后绘制三角形的代码在绘制Bezier三角面片当中
试验效果
棒棒哒~~
PN三角形(Curved PN Triangles)相关推荐
- OpenGL PN三角形的分化
OpenGL PN三角形的分化 OpenGL PN三角形的分化简介 源代码剖析 主要源代码 OpenGL PN三角形的分化简介 在上一课中,我们在 OpenGL 4.x 中介绍了 Tselselts( ...
- R语言ggplot2可视化:在选定数据点周围添加三角形(Add Triangles Around Select Data Points)
R语言ggplot2可视化:在选定数据点周围添加三角形(Add Triangles Around Select Data Points) 目录
- 【数字化】PLM视角下,数字化工厂的构建之道!
本文立足智能制造,从PLM视角下,提出了数字化工厂的概念,确立了其内涵与定位.针对数字化工厂的通用技术.应用技术.业务活动及管理等内容开展研究和分析,形成了数字化工厂的技术体系框架,并给出了支撑数字化 ...
- 驻极体,PN结以及电子管相关问题
简 介: 人们的有限生命使得我们对于外部世界的了解大部分基于前人的总结与抽象.对于其中院里的探索渐渐失去了兴趣和信心.本文给出的三个对象背后似乎存在这某种联系,这需要进一步的分析. 关键词: 物理问题 ...
- 如何利用PN结来测量温度?
简 介: 根据PN结的电流电压方程,可以看到它与PN温度有关,基于此可以用于测量环境或者芯片内部的温度.选择NPN,PNN三极管(2N3906,2N3904)所得到的温度比起普通的PN届更加的精确.本 ...
- 半导体基础知识(2):PN结二极管和二极管特性
文章目录 写在前面 正文 pn结和半导体二极管 正向和反向偏置 二极管作为电路组件 结论 原文附录 The pn Junction and the Semiconductor Diode Forwar ...
- 再谈PN学习(Tracking-Learning-Detection)
本文转自http://blog.csdn.net/carson2005/article/details/7647519 之前翻译过一篇PN学习的文章:http://blog.csdn.net/cars ...
- PN learning
申明:以下文字为笔者阅读了计算机视觉国际会议论文之后翻译所得,其中个别部分加入了笔者自己的理解,但绝大部分都尊重了作者的原意.鉴于本人水平有限,个别地方可能存在误差,希望各位能够谅解!另外,如果您需要 ...
- 模电学习第一天--PN结梳理
基本概念 本征半导体:纯净的.具有晶体结构的半导体 两种载流子:自由电子.空穴(两种载流子均参与导电) 本征激发:半导体在热激发下产生自由电子和空穴对的现象 复合:电子填补空穴 动态平衡:一定温度下, ...
最新文章
- 编写Makefile中遇到的各种奇葩问题汇总
- Vyond制作2D动画学习教程
- Linux/Unix环境下的make和makefile详解
- 冰岛试行四天工作制大获成功:每周缩短五小时,生产力没变!
- MediaPlayer loading 问题解决
- 强化学习(十三) 策略梯度(Policy Gradient)
- Python:利用python编程实现三维图像绘制展示(六面体旋转、三维球柱状体、下雪场景等)
- CQRS, Task Based UIs, Event Sourcing agh!
- 【深度学习】你有哪些深度学习(RNN、CNN)调参的经验?
- 16_Android生命周期再介绍,通过androidconfigChanges属性让界面旋转时不改变状态中保留的值
- Normalize.css :一种用于重置默认的CSS样式的样式工具
- 国科大prml--SVM
- 迭代获取ViewState
- hbase scan超时设置_HBase学习之路 (六)过滤器
- [转]easyui 全部图标
- submit text 插件安装教程
- 【Computer Organization笔记18】大实验讨论:控制器设计、指令流程表
- 永恒python怎么用_毫无基础的人如何入门 Python ?Python入门教程拿走不谢啦!
- 已解决(Python语法报错)SyntaxError invalid syntax
- AMiner发布2022 AI 2000人工智能最具影响力学者名单
热门文章
- 移动端overflow无效问题
- EC20 TCP/IP指令例程
- 学会KPT工作汇报方法
- 深度解读 | 等保2.0之移动互联安全扩展要求解读
- Android R system_ext动态扩展分区
- 珠峰峰顶首次5G通话背后的中国“荣耀”时刻
- 固态硬盘分区电脑分区软件
- c语言百日刷题第四天
- 【翻译】DFPE: Explaining Predictive Models for Disk Failure Prediction DFPE: 解释磁盘故障预测模型
- Qt msvc使用basler 相机pylon sdk进行windows编程测试