本帖最后由 zhang_liang 于 2023-9-6 21:46 编辑
一、成像雷竞技下载找ray666点vip优化程序:球面光线追迹
要想做自己的雷竞技下载找ray666点vip优化程序,第一步当然是解决光线追迹的问题,我并不打算采用链接其他软件的方式来获取光线追迹功能,这和咸鱼有什么区别?,当然是做自己的追迹模块了,那么我们先从简单的球面追迹开始。
先说一下思路,然后把推导过程贴图在下面,太多了,我电脑懒得打。
1. 将光线在空间中以参数方程的形式写出来。包含起点坐标以及方向向量
2. 将球面表达式写出来,包含球心,半径,当然了,我们先不考虑偏心的情况,那么球心坐标一般就是(0,0,z0),还是比较简单的
3. 联立方程然后求解,一步步推导后会发现就是一个一元二次方程,用求根公式即可
4. 注意在有解的情况下,一般都有两个解,就是光线到底打到了球面的左边还是右边,这个时候根据你表面曲率的正负来判断到底是哪个解。
5. 求出交点,然后就有了这个交点处的表面法向量,根据入射向量和法向量求出射光线向量,这一步用向量形式的折射定律解决。
根据以上推导过程就可以写程序了,matlab对数学编程比较友好,可以先实现一下。这里给出我写的matlab函数,值得注意的是,这个函数里用的求交点的方法和我推导的不太一样,是《
雷竞技下载找ray666点vip设计(徐金镛,孙培家)》一书中的方法,偏向于向量计算,但是计算复杂度应该是差不多的。
%+++++++++++++++++++++++++++++++++++++++++++++
%经过一个表面的折射过程计算
%输入光线位置、方向向量x,y,z,alpha,beta,yita
%输入镜头表面参数R1,Z,n,n1
%输出光线位置、方向向量x1,y1,z1,alpha1,beta1,yita1
function [x1,y1,z1,alpha1,beta1,yita1]= optic_3(x,y,z,alpha,beta,yita,c,n,n1,Z)
a=yita.*(Z-z)-beta.*y-alpha.*x;
Mz=z-Z+yita.*a;
MM=Mz.^2+(y+beta.*a).^2+(x+alpha.*a).^2;
factor_1=yita.^2-MM.*c.^2+2.*Mz.*c;
non=factor_1>0;% clear the unusal number
factor_1=factor_1.*non;% clear the unusal number
deta=(MM.*c-2.*Mz)./(yita+sqrt_zl(factor_1));
D=a+deta;
x1=x+alpha.*D;
y1=y+beta.*D;
z1=z+yita.*D;
cosI=abs(yita.*(1+(Z-z1).*c)-beta.*y1.*c-alpha.*x1.*c);
factor_2=1-n.^2./(n1.^2).*(1-cosI.^2);
non=non.*(factor_2>0);% clear the unusal number
% cc=unique(cc);% clear the unusal number
factor_2=factor_2.*non;% clear the unusal number
cosI1=sqrt_zl(factor_2);
g=n1.*cosI1-n.*cosI;
alpha1=n./n1.*alpha-g./n1.*x1.*c;
beta1=n./n1.*beta-g./n1.*y1.*c;
yita1=n./n1.*yita+g./n1.*(1+(Z-z1).*c);
x1=x1+1000.*(1-non);% clear the unusal number
y1=y1+1000.*(1-non);% clear the unusal number
z1=z1+1000.*(1-non);% clear the unusal number
% alpha1=0;% clear the unusal number
% beta1=0;% clear the unusal number
yita1=yita1+(1-non);% clear the unusal number
x1=real(x1);
y1=real(y1);
z1=real(z1);
alpha1=real(alpha1);
beta1=real(beta1);
yita1=real(yita1);
end
%--------------------------------------------