UE4:极坐标整活

您所在的位置:网站首页 坐标化成极坐标 UE4:极坐标整活

UE4:极坐标整活

2024-01-20 16:03| 来源: 网络整理| 查看: 265

距离上次写专栏已经有一个多月了,最近UP也是有那么亿点点忙,期末提前又天降三门新考试科目,对于像UP这样考前俩月才开始预习的来说压力可谓是超级加倍。

是甚么原因让一个挂科边缘的人来整活呢,那当然是没有原因,你看这个UP已经神经混乱了,CS段和DS段都丢失了,很快啊,啪的一下有一连串的神经搭线搭出了一个浑元形意太极的图像,源濑氏·左田的形象突然闪现到我面前。。。。。。然后UP就带着他的整活文章赶来了。

旋转的太极图

今天这个整活制作难度应该就前两次来说是比较简单的。

看过我第一期的视频的应该知道我在处理多边形边界的时候用到了极坐标求边界

有的读者反映极坐标讲的不是很细致,我这次正好再来说道说道,这个所谓的极坐标。

老规矩这次依旧是分两个模块,先将极坐标的概念再讲程序的实现,大佬们可以跳了

wtf is 极坐标

我们常见的坐标系应该长这样的

把这个坐标系写进UE里(上期矩阵那里讲过UE里这样的坐标系是怎么理解的

不理解的小伙伴可以看一看)

在UE中的样子

我们在UE里还能发现这样一个节点叫VectorToRadialValue

他是将一个二维向量坐标形式转成极坐标形式。

那么什么是极坐标呢,在上一篇文章中我们提到了,要使用一种方法让平面内每一个点都能拥有其独一无二的ID用来区分每个点。这次我们换一种方式来看待这个极坐标,从二维直角坐标系出发。

比如我们在平面直角坐标系上找一点A(√3,1),然后从A向X轴和Y轴作垂线分别交于Hx和Hy

还是用纸的形式PS再往后延一下先考完试=-=

很快啊,应该能推出来Theta=30°和OA的长度是2(勾股定理1:√3:  2),然后我们就可以用(2,30°)来表示这个点。。。。。。

读者内心OB:这个UP怕不是根据结果推过程,我怎么会知道用这个,水的一批,退了退了。

且慢,容我再辩解一下

想一下这个A点坐标(√3,2)的含义是什么,这个√3和这个2他表示的是什么,是A到两个坐标轴垂线段的距离,那么我们可以轻易的认为A点的x和y分别对应着直角三角形OAHy或者直角三角形OAHx的两条直角边长度,进而我们把研究方向转向了研究这两条直角边有什么联系,我们那直角三角形OAHx为例,根据三角函数sin和cos的定义我们可以知道sin(Theta)=AHx/OA,cos(Theta)=OHx/OA。等式两边同乘OA得到了y=AHx=OA*sin(Theta),x=OHx=OA*cos(Theta)。

至此,我们发现了A点坐标的x和y都与OA和Theta有关系于是我们就把x换成OA*cos(Theta),把y换成OA*sin(Theta)。

那么为什么我们要用极坐标系呢?

对比一下(x,y)的坐标表述方式,极坐标用的是(r,Theta),不难看出用极坐标可以直观得到一个点距离原点的距离和OA与x轴的夹角,而如果想知道(x,y)坐标到原点的距离就要用勾股定理算然后用arcsin或者arccos才能得到OA与x轴的夹角。然而回想一下我们刚才的推导过程是通过x=rcos(Theta)和y=rsin(Theta)得到的极坐标的表述方法。我们平时还是以见到(x,y)形式的函数多一些,比如y=x^2+1、y=x+1之类的,难道我们还要每次都先把直角坐标系函数通过x=rcos(Theta)和y=rsin(Theta)转成极坐标系方程再用吗,这不麻烦得要死吗?而且多此一举。

的确,如果是要走这么个过程相信这个办法肯定不会出现在我们的教科书上,那这个极坐标到底有什么优点能让其出现在我们的教科书上呢?

回想一下第一期我们做的多边形蒙版

这里大家可以试试,用极坐标系和直角坐标系两种办法来写一个中心在(0,0)的正三角形(默认OA、OB、OC都是1即是一个圆内接正三角形(正三角形每个顶点都在圆上))

提示:OA、OB、OC把这个三角形分成了完全一样的三个部分

首先我们要明确一下目标,我们要得到y和x的关系式或者r(OM长度)和Theta的关系式。

先来看左边的直角坐标系,打眼一看,好像十分简单,但是又好像做不出来。最好想的办法就是把AB、AC、BC的解析式算出来,能算出来吗?能算,但是麻烦死了,相当于解三个一元方程,算数这种东西是希望越少越好,尤其是在算解析式的时候,一个不留意大脑里数据溢出容易直接GG。

我们再来看极坐标的方式,OM=r,∠MOA=Theta。推导过程看上一张图,把Alpha带入120°即可,我们能很轻易得到r=cos60°/cos(60°-Theta)这里我们默认的是OA、OB、OC是1,如果没有这个默认OM=OA*cos(Alpha/2)/cos(Alpha/2-Theta)。很轻易的我们能得到r和Theta的关系式,而且!!这个关系是个周期性的(注意这里是周期性的不是镜像),也就是说当Theta对应的r和Theta+120°对应的r长度是一样的!!!

这里读者可以自证一下很简单的。

通过这个例子我们发现,我们在选择采用极坐标的时候往往是不知道这个图形的函数,为了画这个图形而创造函数我们选择极坐标。还有一种情况我们会用到把已知的直角坐标系函数换成极坐标函数用于求解(今天的例子就用到了),我们要求一条直线过圆的交点间距(只要是跟点间距挂钩的一般我会选择直接极坐标系)。

这一部分的最后我带大家解析一下VectorToRadialValue这个函数

我们输入的是一个标准的x是【-1,1】,y也是【-1,1】的直角坐标系,输出给了三个引脚,第二引脚是Angle(0-1映射0-360°,0度点在三点钟位置逆时针增大),第三引脚是到原点的距离,越往外越大(后面减去1是让大家确定距离为1的边界)

打开这个函数,当你输入第二引脚为真第一引脚输出就是Angle Append Distance(红色是Angle绿色是Distance)输入为假就反过来

我们开始吧

首先确定我们的思路,因为我们这个是纯数学去计算一个图形,肯定要舍弃一些不对称的美,也就是说,我们算出来的图形,圆就是圆,弧就是圆弧,当然这也不错。

我们先拆解一下这个图形,思考一下这个图形是怎么通过基本图形构成的

我做的时候大致拆成了这三个部分

先说第二个,也就是我们最简单的一个,这个不用我讲大家应该也能做出来,我们要一个圆心在原点半径为1的圆一半黑一半白。我在这里用的是直角坐标系的公式x^2+y^2=R^2,读者可以换成我们学的极坐标系方程来做做试试(圆心在原点的圆极坐标系方程为r=r思考一下为什么)

画圆那里也可以用SphereMask注意一下这里的ceil,小于0的数ceil之后是0不是-1

再说一下第三个,我们要得到两个小一点的半圆,圆心分别在(0,0.5)和(0,-0.5),半径是0.5。

注意:这里千万先别考虑怎么合成!!!

千万先别考虑怎么合成这个图

回忆一下我们前面讲的正三角形的极坐标表达,我们把正三角形切成了三个完全一样的小三角形然后说他是个周期的,Theta、Theta+120°和Theta+240°对应的r是一样的,同理,我们只需要考虑上半圆。(不清楚的话再回头看看上面)

有内么一丢丢的丑==

emmmm就当这是个半圆把,C是圆心,M是半圆上一点,CH是从C到OM的垂线

轻易通过Alpha/2+∠COH=90°=Theta+∠COH得到Theta=Alpha/2

由于M只要是在圆弧上移动,CM就是半径等于CO。△OCM为等腰三角形OH=MH,所以OM=2OH=2(R*sin(Alpha/2))=2R*sin(Theta)我们就找到了OM和Theta的关系,Theta的范围就是【0,90°】(这里补充一下,起点Theta为0的时候O、M重合)(再补充一点,UE里的sin、cos函数输入的是0-1,也就是说如果输入的是0.5相当于输入180°也就是PI不要搞错了)

然后就是填色,让半圆内是1外是0,按道理说把你算出来的值和极坐标的distance引脚比较,大于为0小于为1,应该就行了,但是有点问题,我们的Theta应该只有在【0,90°】才有定义,其他地方应该没有定义,默认输出应该是0。那么我们如何限定角度?

我们拿极坐标的Angle引脚和0.25(0-360度映射到0-1:的情况下0.25和1/4映射为90°)作比较是不是就能得到两个部分(因为Angle引脚的范围就0-1)一部分是【0,1/4】这是我们需要的,另一部分是(1/4,1)这是我们不需要的,用个if把不需要的部分赋值为0(想想为什么)

那么问题来了,我们如何补充出下半段?

先思考一下顺便喝口水。

回来了,因为我们有两个一对对称图形,所以算周期的时候应该是1/2(360°/2)。上次讲过我们有一个Fmod节点能完美满足我们的要求(5/3=1...2,Fmod(5,3)=2)再注意一下我们所说的是周期性的不是镜像性的

这是镜像(x为对称轴的对称图形)这是周期(以原点为对称点的中心对称)

这里说一下为什么要强调周期,因为比如我们要Fmod(1,0.5)相当于在0-0.5的时候都是原值,而当到达0.5的时候值会清零再从0开始计数,会发现这两个0-0.5的计数是按照中心对称的(这里不理解不会影响下面,看不懂的话就别纠结了)

现在范围从原来的0-1变成了0-0.5(0)-0.5了,那么问题又来了,我们需不需要改动前面的代码,要改的话要怎么改?(如果不需要改的话想想为什么)

ok,我们先不讨论如何合并,这个放在最后,我们再看第一个也就是最难的一个图

两个圆,圆心分别在(0,0.5)和(0,-0.5),半径是0.25

乍一看好像和上面的半圆差不多,顶多就是补全了另一半,然而真的是这样吗?

按照老办法通过集合去找OM的长度,发现每一个Theta对应的OM其实有两个!想想过圆心与圆相交是不是总能交出两个点(相切的时候两点重合),但是这是为什么,刚才做的时候不是好好的吗,其实刚才也是过两个点,只不过另一个点是定点也就是原点(可以回去再看一下)whatever,其实这不是关键点了,现在的问题是我们没有办法通过几何轻易的获取OM的长度了。

我们只能通过极坐标函数的形式来求解了,先科普一下圆的公式(UP比较菜只记得直角坐标系下圆的函数,按照我们x=rcos(Theta)和y=rsin(Theta)换就行)(x-圆心的横坐标)^2+(y-圆心的纵坐标)^2=半径的平方,拿我们要的数据代入(还是只做上面的)变为x^2+(y-0.5)^2=0.0625,再化成极坐标形式r^2-rsin(Theta)+0.1875=0。

What Next?

这里来到了我们第一个坎,我们怎么上色?这次我们解出来两个OM到底用哪一个?思考一下。

我们不妨画一下这个函数图形,假定我们的Theta是一个定值(为了好看我把sin(Theta)换成b,把r换成x)就得到了x^2-bx+0.1875=0,得到了一个二次函数,二次项系数为1开口向上,我们前面说过了,Theta的取值是有范围的,就是直线一定要与圆相交,由于这里的x就是r,我们希望直线与圆相交的两个交点对应的两个r中间的值填上白色,在x的二次函数中怎么体现出来?(这里建议想通)

OM1=x1,OM2=x2,而介于OM1和OM2之间的长度是不是就是介于x1和x2之间的值呢,换句话说,只要这个二次函数函数值小于0的值涂上1大于等于的涂上0就行了!!!

就是对于每个属于取值范围内的Theta的取值只要满足r^2-rsin(Theta)+0.1875



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3