吾爱光设

会员须知
会员须知
实用帮助
实用帮助
查看: 1538|回复: 0

[交流] 球面光线追迹

[复制链接]
  • TA的每日心情
    慵懒
    2023-9-6 20:59
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    2

    主题

    4

    回帖

    0

    积分

    小白

    积分
    0
    发表于 2023-9-6 20:55 | 显示全部楼层 |阅读模式
    本帖最后由 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
    %--------------------------------------------


    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?注册

    ×
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    联系我们|本论坛只支持PC端注册|手机版|小黑屋|吾爱光设 ( 粤ICP备15067533号 )

    GMT+8, 2024-11-6 11:33 , Processed in 0.078125 second(s), 22 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表