分享

Rman中的坐标系等

 Tech-d 2013-05-22
Renderman为左手坐标系,要转为右手坐标系:
Scale 1 1 -1

current:
所有的点初始进入的空间,也是灯光计算发生的地方。注意不同的渲染器的current空间是不一样的。

object:
以被我们shading的图元作为标准的坐标系。

shader:
在shader被我们声明(通过Surface, Displacement, LightSource等语句)的一瞬间被激活的坐标系。

world:
在WorldBegin命令出现时被激活的空间。
与camera space相对的概念,而非相反。当WorldBegin被调用时,world space被初始化。当前transformation matrix在此时与一些已固定的选项一起保存为正式的world-to-camera matrix,然后当前的transformation matrix 被重置为indentity。从此时开始,到WorldEnd为止,对当前transformation matrix的改变创建的都是与world space相关的坐标系,即,矩阵从local坐标系指到world空间。

camera:
原点在相机镜头的中心的坐标系。 
PRMan默认的初始坐标系,左手坐标系。+z轴伸向相机前方,+x轴指向左边,+y轴指向上方(左手坐标系)
当Projection被调用时,camera space就被创建了,在此时,当前的transformation matrix被设置为indentity。从Projection 到WorldBegin为止,任何对当前transformation matrix的改变其实就是建立最终的world-to-camera矩阵。

screen:
位于相机的成像平面(image-plane)的perspective-corrected 坐标系。原点(0, 0)在screen空间中是看向camera空间的z轴方向时的位置。

raster:
最终输出图像的2D投射空间,单位为像素。(0, 0)位于图像的左上角。

NDC:
Normalized device coordinates — 与raster空间类似,但是x和y值被标准化过了,所以范围为[0, 1]。左上角为(0, 0),右上角为(1, 1)。

========================================================
点:3D空间的位置
向量:有长度和方向,但是没有具体位置
法线:特殊类型的向量,垂直于表面,因此能够描述表面的朝向。它的某些转换法则跟普通的向量不太一样,以后会介绍。

点的数值默认的是描述的current空间下的一个位置,也可以转换为别的空间的位置:
point P0 = (3, 5, 8);
point P0_0 = point (3, 5, 8);
point P1 = point "object" (0, 1, 0);
vector V1 = vector "world" (3, 5, 6);
normal N1 = normal "shader" (4, 5, 7);

如上的语句格式都是正确的。注意point P1 = point "object" (0,1,0); 的意义并非是将P1赋值为0,1,0,而是设定P1代表了一个在object空间中位置值为0,1,0的点,在其他空间中则会转换成其他值。注意理解,这句表达式并非set components of P1 to (0, 1, 0),P1实际上包含的是在current空间中的一组数据,这组数据跟在object空间中的(0, 1, 0)表示的是同一个位置
有一些计算发生在特定的空间里会比较容易计算,比如所谓的"solid texture"加载在运动的物体上,此时使用object空间比使用current空间更方便。

SL提供了transform,vtransform,ntransform等函数,用来对点,向量和法线进行空间转换,小心不要用错函数,因为对点,向量和法线的转换还是有一些的不同的。需要注意的是SL只负责转换和记录结果,不会管点的值目前是在哪个空间里,需要程序员自己留心使用,否则会造成难以追踪查出的错误。

========================================================================
Matrices
matrix也是SL的一个类型,用来表示一个4X4的转换矩阵。
matrix zero = 0; /* all 0 components*/
matrix ident = 1; /* the identity matrix*/

float m00 = 0, m01 = 0, m02 = 0, m03 = 0;
float m10 = 0, m11 = 0, m12 = 0, m13 = 0;
float m20 = 0, m21 = 0, m22 = 0, m23 = 0;
float m30 = 0, m31 = 0, m32 = 0, m33 = 0;
matrix m = matrix (  m00, m01, m02, m03,
m10, m11, m12, m13,
m20, m21, m22, m23,
m30, m31, m32, m33 );

注意,将一个matrix赋值为单独的一个非零浮点数,只会让这个矩阵的对角线元素都为这个浮点数,而其他元素的值则为零。
matrix也可以声明所在空间:
matrix q = matrix "shader" 1;
matrix mw = matrix "world" (   m00, m01, m02, m03,
m10, m11, m12, m13,
m20, m21, m22, m23,
m30, m31, m32, m33 );
矩阵m的逆矩阵可以用1/m来表示,所以m1 / m2 实际上是用m1与m2的逆矩阵做乘法。

==================================================================
string:
strings可以检查相等性或做一些转换,format(), concat()等函数就有这种功能。在SL中,string必须且只能为uniform的。

uniform的意思是,在这个表面上,被复制的变量的值在物体表面是不会变的,除非你手动改变它;注意区别uniform跟read-only。
varying的意思是在表面的不同位置,这个变量的值是不一样的。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多