一个计算黑洞引力透镜效应的demo。
B站视频 https://www.bilibili.com/video/BV1bo4y1973Q
demo图
-
archive/*, matlab-demo/*: 第一版,渲染图片
-
src/*, pics/*: 第二版,渲染图片
-
video-rendering/*: 第三版,可以渲染图片+视频
第一版只适用于r趋于无穷的情况(至少取30),因为做的近似比较大。
第二版、第三版适用于所有正数r。
第一版、第二版算法见“数学推导.pdf”“讲稿.pdf”。这两个版本光子方程没有解全,少了一类解,是我当时的疏忽。面向黑洞时渲染没问题,背对时画面中会有一块黑色区域,就是少的一族解。
第三版用的算法和第一版、第二版类似,具体解的形式、实现上有略微差别,pdf还在写。。(咕咕咕)(写完就删第一版、第二版,彻底解决历史遗留问题)
目前最完整的就是第三版,而且第三版可以渲染视频。所以就看video-rendering/*下的内容吧。
现在还存在的问题:
采样背景图时采用全局坐标,事实上应当使用观察者的局域坐标系。
局域坐标系与运动状态有关,很复杂,等我有空再弄。而且,就算观察者静止,局域坐标系和全局坐标也有区别。具体可参考观测量理论,俞允强写的《广义相对论引论》,北京大学出版社,第四章。
但是如果离黑洞较远(r趋于无穷),局域坐标系可以近似为全局坐标。所以,r较大时的图像是准确的,r较小时只能做参考。
见 数学推导.pdf
纠错(2019-11-26):
- 第5页开头theta_m少了一个常数1/w/sqrt(1+m)
- 轨道常数D的计算过于复杂,其实D=1/sqrt(cc)。(第1页第5行方程直接取u=0,注意D=d{theta}/du=1/sqrt(cc))
- pdf里使用的图片采样方式是平铺,第二版c++程序里使用天空盒。
讲稿.pdf
(本人某课的课程报告)
-
到 video-rendering/ 目录下
-
把 lensing.cpp 编译成动态库,编译器需要开启C++17
-
运行 lensing.py (python需要装opencv、scipy)