PN-Traniger
首先先从Bezier说起:
一条直线上有两个端点,P0和P1,那么直线可以写成 y = kx+b ,其实也就是P(t) = (1-t)P0 + P1 (这是个插值函数),(小注,我时常把这两个东西系数写反,其实代入0和1就不会弄错了)T的值范围定义为[0,1]的话,就是这线段上所有的点了(集合)
当然P是(x,y)或(x,y,z)是向量,(1-t)和t是权(高中时候和另外一个同学被椭圆和直线之类的题目折磨的痛不欲生,后来发现了公式,不过自己忘了,反正很有意思的,快速求解数学题目…..)
两个点可以定义一条直线,曲线是什么了,利用微积分的思想,曲线是无穷直线的集合.如何通过几个点,给上0-1的参数求出位于这条曲线上的其他点了?还是老办法,插值.Paul De Casteliau发明了插值方法,是三个点的,加速有P1,P2,P3三点,一方面,我们希望这三个点都应该影响插值后点,但是上面那个式子只是两个点的,于是我们两两求点,然后对中间结果再做插值是再显然不过的了
Temp1 = (1-t)P0+tP1 Temp2 = (1-t)P1+tP2 然后result = (1-t)Temp1 + t Temp2,这是一种很自然的想法,化简下这个式子,把P0,P1,P2整合到同一个式子中:
P(t) = (1-t)^2 P0 + 2t(1-t) P1 + t^2 P2
这是三个点,很显然的,我们可以以此类推,四个点,五个点,系数就是杨辉三角系数,或者C(m,n) ,(a+b)^n a是(1-t) ,b是t ,n是点数-1
(WORD文档不会输入公式,懒得从网上找图,n阶的就不写了)
然后代入t从0到1,生成了一系列的点,结果非常之好啊,如下图:
这东西就是Bezier曲线,这东西有个非常好的特性,假设我们要做对这曲线仿射变换(具体概念请搜索) ,那么有两种方案
第一种,变换原来的点,然后再来进行插值计算
第二种,变换插值计算后的点(数量变多了)
第一种是可行的,因为Bezier的特性保证了,具体证明可代入计算(代入证明即可)
前文已经说过,这只是一种很自然的想法,当然,还有别的插值方法 比如说我们可以利用系数的导数,这也是可行的!
学过高数忘得不太惨的同学,一定能记得求导(微分)出来就是切向量()
P(t)' = d/dt()(P(t)) ,当t=0和1时,分别是P0和P1的切向量(Bezier曲线的切向量)
假设有四个控制点的话,那么
P(0)' = 3(P1-P0)
P(1)' = 3(P3-P2)
我们可以利用这个导数(斜率不是吗) P1和P2可以分别通过P0和P3球
当然,这样球出来的曲线和Bezier曲线是一样的,只是式子不同(最终化简还是一样的)
最关键的是,我们可以自己选择 切向量的求法,比如说用Pi-1和Pi+1之间定义Pi处的切向量
同理,还有Bezier表面,(四个点) 在横向上求两次插值,然后对这两次插值的结果求插值(注意,这里有两个系数,横向用系数u,纵向用系数v)
同理,可以扩展为3X3的点4X4的点
前文已经说完,让我们进入正文,三角形怎么进行插值?系数又有几个了,有一种很自然的思维方式同样存在(重心坐标系)
P = uA+vB+wC; (u+v+w=1) (u,v,w为对应面积比(http://www.cnblogs.com/leohawke/archive/2014/03/08.html 此文已讨论重心坐标)
当定义非共面的三角形时,增加三个点即可(二阶) 三阶为下图这种, 三角形中也存在控制点
PN三角形(point-normal) 是采用Bezier三角形,加上了法线的考虑(来球控制点).假设三角形有三个点(每个点有自己的法线,通过球平均而来,所以可能是不同的)
假设改变上有一点P21 = 2/3 A + 1/3B 即在AB的1/3处,然后将P21投影至A处的切平面(A有切线Na),就可以得到一个控制点P210
切平面垂直于A点,且沿着Na 投影,其实也就是将向量 B-A/3 投影至Na上,我们可以得到投影长度,然后变可以得到在Na上的那部分
为什么要减,我是不清楚的(如图)
图上成的钝角,我们可以设V21 = - (Na*(B-A)/3)Na (钝角乘出来是负的,反之) ,于是控制点
P210 = P21+V21(P21 = 2/3 A + 1/3B)
还有一个控制点,系数自然是2/3,只不过法线是B的法线(更靠近B),同理可以新增加6个点.中间那个点就等于(所有新生成的点相加除以4 减掉 原来的除以6)
设V = A+B+C/3
设E = P210+P120+…./6 中心点P111 = E+ (E-V)/2
P下标的含义很有意思,就是Bezie三次曲线对应的幂 http://www.cnblogs.com/mikewolf2002/archive/2012/08/21/2648421.html 具体代码参加此文
构造法线并没有使用三阶公式,过于复杂,于是只需要生成三个新法线,对点和法线使用同样的参数进行插值就行了
生成控制法线用原来的平均值是个不错的想法,不过有时会造成错误.比如下图:
正确的法线应该是斜的才对,
我们可以求 P1和P2的法线(存在这样一个平面 Np = Norm(P1-P2) )然后将平均法线 视为一个入射光,法线是Np(入射平面是P1和P2所成平面)求出反射向量,即是我们要求得控制法线了
至于求反射,HLSL提供了内置函数
PN-Traniger的更多相关文章
- PN结的单向导电性及PN结的电流方程及PN结电容
PN结加正向电压 当PN结外加正向电压时,外电场将多数载流子推向空间电荷区,使其变窄,削弱了内电场,破坏了原来的平衡,使扩散运动加剧,PN结导通.PN结的压降只有零点几付,所以在其回路里应串联一个电阻 ...
- PN结的形成
P型半导体 在纯净的硅晶体中掺入3价元素如硼,使之取代晶格中硅原子的位置,就形成了P型半导体.在P型半导体中,空穴为多字,自由电子为少子,主要靠空穴导电.掺入的杂质越多,空穴的浓度就越大,导电性就越强 ...
- PN结加正向偏置电压 其空间电荷区为何变窄
理论基础:导体是内部具有较多可以自由移动的电荷的物体. 绝缘体是内部没有或者有很少可以自由移动的电荷的物体. +代表空穴带正电 -代表电子带负电 两竖线之间表示无自由移动电子或空穴部分,相当于绝缘体 ...
- AET PN结
电场方向 电场方向和正电荷受力方向相同 飘移运动和扩散运动 多子和电场方向互相抵制,而多子是扩散运动,而对少子则是促进作用,当扩散和漂移达到动态平衡时,我们称PN结形成 PN结特性 单项导电性
- 非常有助于理解二极管PN结原理的资料
https://www.zhihu.com/question/60053574/answer/174137061 我理解的半导体 pn 结的原理,哪里错了? https://blog.csdn.net ...
- Centos7.4使用SoftEther搭建V.PN
参考: https://blog.csdn.net/qq_39591494/article/details/78625394?locationNum=9&fps=1 https://www.b ...
- PN结讲解
可能大家在使用半导体器件的时候只是在使用它的电气属性,并没有很好的关心下它是什么原因才有了这样的电气属性,那么我们本篇就从物理结构分析下PN结吧. 首先看一张比较陈旧的图图: (就按自己的笔记简单谈谈 ...
- 二级管工作原理(PN结原理)学习
0.小叙闲言 前面已经写了两篇介绍放大器应用和MOSFET作驱动的文章:常规放大电路和差分放大电路和MOSFET使用与H桥驱动问题.但是对它们的工作原理并没有进一步研究一下,今天写下这篇文章,主要是介 ...
- HDU.2147 kiki's game (博弈论 PN分析)
HDU.2147 kiki's game (博弈论 PN分析) 题意分析 简单的PN分析 博弈论快速入门 代码总览 #include <bits/stdc++.h> using names ...
- 免費域名申請.me .im .in .co .la .do .ms .kz .tk .ru .mu .pn .tt
免費申請域名 .la .la 域名 – 原先是ICANN分配給老撾的國家頂級域名,不過後來被同時作為了美國洛杉矶市的域名後綴. 免費申請地址: http://www.idv.la http://www ...
随机推荐
- C++11初始化列表
[C++11之初始化列表] 在C++03中,在严格遵守POD的定义和限制条件的结构及类型上可以使用初始化列表(initializer list),构想是结构或是数组能够依据成员在该结构内定义的顺序通过 ...
- C3P0连接池使用小结
C3P0在最近的demo中也用了(我用的是0.9.2.1版本),因为单例很难应付大量并发. 用法详见文档:http://www.mchange.com/projects/c3p0/ 基本的用法在htt ...
- 小巧实用js倒计时
<script type="text/javascript"> var intDiff = parseInt(15); //倒计时总秒数量 functi ...
- WPF中的DependencyProperty存储方式详解
前言 接触WPF有一段时间了,之前虽然也经常使用,但是对于DependencyProperty一直处于一知半解的状态.今天花了整整一下午将这个概念梳理了一下,自觉对这个概念有了较为清晰的认识,之前很多 ...
- jQuery 的选择器
本文来自网上转帖 1. 基础选择器 Basics 名称 说明 举例 #id 根据元素Id选择 $("divId") 选择ID为divId的元素 element 根据元素的名称选择, ...
- CacheView。
1. ChromeCacheView 2. MozillaCacheView
- js ajax上传图片到服务器
$("#up_goods_pic").on('change',function(){ var file = this.files[0]; var url = webkitURL.c ...
- cocos2dx 兼容性
报错: Caused by: java.lang.UnsatisfiedLinkError: Couldn't load cocos2dcpp: findLibrary returned null 因 ...
- PostgreSQL没有redo log multiplexing
与Oracle不同的是,PostgreSQL中压根没有这种的东西. 若以,如果因为写在线WAL文件是发生磁盘I/O错误,那么数据库系统就启动不了了. 解决的办法,我想,在PostgreSQL中,如论如 ...
- PL/pgSQL学习笔记之六
http://www.postgresql.org/docs/9.1/static/plpgsql-declarations.html 39.3.1. 声明函数参数 传递给函数的参数被用 $1.$2等 ...