2017 fall CG course assignment2
2017 fall SJTU CG course assignment2
For english version : English version
作者:关超宇
E-mail : frozenmad2015@outlook.com
License : MIT License
注:引用或转载请注明出处
main.py
运行时的主程序,请将修改代码增添至该文件中
Spacial.py
空间、几何体、光源的实现代码
utils.py
一些功能函数的封装
load_model.py
从obj文件中构建模型
通过重命名
from PIL import image
import numpy as np
from Spacial import *
from utils import *
# 如果需要从.obj文件导入几何模型,那么还需要包含如下环境
# from load_model.py import *
np.array()
函数来得到更简洁的语法:接下来步入正题
arr = np.array
my_space = Spacial()
(50,0,0)
的位置上,方向向量为:(-1,0,0)
,up向量为(0,0,1)
,前景面为20,后景面无穷远。如果需要自己设置相机的参数,可以通过新建相机并设置为空间的相机来达到目的
my_camera = Camera(position = arr([50,0,10]), orientation = arr([[np.pi/2,0,np.pi]]))
my_space.setCamera(my_camera)
Camera
类的相关参数详见Spacial.py
接下来,你可以新建一些几何体,举个例子:
my_sphere = Circle(arr([0,0,0]),2))
my_quad = Polynominal([arr([-10,10,-10]),arr([-10,10,10]),arr([-10,-10,10]),arr([-10,-10,-10])])
目前软件可以支持的几何体有:
Circle()
Triangle()
CompleteTriangle()
Plane()
Polynominal()
Complete_Polynominal()
Cube()
get_model(path)
# 此项需要import load_model.py相关参数请参照Spacial.py
的注释,原生几何体需要通过my_space.AddObject()
添加入场景中,而组合几何体需要通过my_space.AddObjects()
来添加。
之后要将这些几何体加入到先前定义的场景中:
my_space.AddObject(my_shpere)
my_space.AddObjects(my_quad)
这个可选步骤是添加光源,没有光源的话,也可以进行渲染,但这样渲染出来的只有物体的泛在光,效果并不好,所以加入光源是一种不错的选择。
首先定义一个光源:
Light = PointLight(arr([0.,0.,40.]))
目前程序支持的光源类型有:
PointLight()
Parallel_light()
相关参数请参照Spacial.py
的注释
之后同样要将光源加入场景中:
my_space.AddLight(Light)
你也可以调用my_space.AddLights()
来一次性加入多个光源(一个light_list)
调用my_space.Render()
即可渲染,改变参数可以调整是正投影还是透视投影,分辨率和窗口大小等等,该函数返回的是一个float类型数编码的RGB矩阵
im_matrix = my_space.Render(orth = True, resolution_width = 200, resolution_height = 200, width = 20, height = 20)
可以利用utils.py
中提供的函数Matrix2Image()
来实现RGB矩阵与image的图片类型的转换,之后可以利用PIL库来执行图片的显示于保存操作
im = Matrix2Image(im_matrix)
im.show()
im.save('example.png')
由于程序采用python写成,仅提供光线追踪算法思想的学习,并没有使用GPU,所以导致渲染速度较慢。
示例程序的环境中一共有两个球,两个三角面片,一个光源,分辨率为200*200,经计算渲染所需时间为50s左右。
再次声明,转载与引用请注明出处~