回到上一篇 POV-RAY基础教程 - 相机(6)

物体、灯光和摄像机的位置都是使用的典型的3D坐标系统。之前,我们讲解过POV-Ray的坐标系统。这里我们在回顾一下,X轴的正方向指向右边,Y轴正方向指向上,Z轴指向屏幕里。坐标系统的位置经常用三个元素来表示(x,y,z),这是很容易理解的。向量也不总是来表示指示方向的。他们也涉及一些对物体移动、旋转和大小控制的操作。大小,位置,方向和变形的坐标操作,与变换标识符有关。

转换

支持的转换包括rotatescaletranslate。它们用于转动,调整大小和移动对象或纹理。一个变换矩阵可直接用于指定一个复杂变换。多个变换可以通过一个变换标记合并在一起。转换的语法如下:

TRANSFORMATION:rotate <Rotate_Amt> | scale <Scale_Amt> | translate <Translate_Amt> | transform TRANSFORM_IDENTIFIER | transform { TRANSFORMATION_BLOCK...} |matrix <Val00, Val01, Val02,Val10, Val11, Val12,Val20, Val21, Val22,Val30, Val31, Val32>
TRANSFORMATION_BLOCK:TRANSFORM_IDENTIFIER | TRANSFORMATION | inverse
TRANSFORM_DECLARATION:#declare IDENTIFIER = transform { TRANSFORMATION_BLOCK...} |#local IDENTIFIER = transform { TRANSFORMATION_BLOCK...}
Translate

Translate关键字经常后面跟着一个向量,这个向量用来确定相对于目前位置,要移动的变化量。例如:

 sphere { <10, 10, 10>, 1pigment { Green }translate <-5, 2, 1>}

上面的代码将会把球体,从<10,10,10>移动到<5,12,11>,而不是<-5,2,1>。另外translate后面的如果有的元素为0,那么就是没有变化。例如:

 sphere { <10, 10, 10>, 1pigment { Green }translate 3*x  // evaluates to <3,0,0> so move 3 units// in the x direction and none along y or z}
Scale比例

你可以通过使用scale标识符来改变物体或者贴图模式的大小。同样的,关键字后面也是一个向量,向量的中元素分别表示原来位置的倍数。scale可以用来拉伸或者压扁元素。大于1拉伸,小于1压扁。多个scale可以用使用。例如:

 sphere { <0,0,0>, 1scale <2,1,0.5>}

上面的代码会拉伸球体变成一个椭球体。X方向是原来的2倍,Y方向不变,Z方向是原来的1/2。
如果向量中三个元素都相同,那么可以用一个常数来代替。另外不能设置为0,系统将发出警告,同时将0变为1,视为没有进行scale操作。

旋转

您可以通过添加rotate修改器来更改对象或纹理图案的方向。向量的中元素分别表示三个轴的旋转角度
注意,旋转是按照X,Y,Z的顺序进行的,如果你对一个复杂的选择变量理解不了,不妨,想宣战单个方向。然后一步步来。

 rotate <0, 30, 0>  // 30 degrees around Y axis then,rotate <-20, 0, 0> // -20 degrees around X axis then,rotate <0, 0, 10>  // 10 degrees around Z axis.

POV-Ray使用的是左手系旋转系统,当进行旋转时,不妨用一下左手试试。

矩阵

matrix关键字可以用来指定具体的变换矩阵,从而应用到物体和纹理上。它的语法如下:

MATRIX:matrix <Val00, Val01, Val02,Val10, Val11, Val12,Val20, Val21, Val22,Val30, Val31, Val32>

Val00到Val32组成了一个4X4的矩阵,一般情况下,矩阵中的第四列会隐式设置成<0,0,0,1>。对于一个给定的点P=

qx = Val00 * px + Val10 * py + Val20 * pz + Val30
qy = Val01 * px + Val11 * py + Val21 * pz + Val31
qz = Val02 * px + Val12 * py + Val22 * pz + Val32

一般的,你是不会使用matrix关键字,因为它比变换命令更不好描述,而且不直观。然而matrix命令可以完成一些更复杂的变换,比如说裁剪操作

 object {MyObjectmatrix < 1, 1, 0,0, 1, 0,0, 0, 1,0, 0, 0 >}
转换顺序

因为旋转操作与轴有关,大小操作与原位置有关,你可能希望在原位置,对物体先进性大小和旋转操作,然后在移动物体。
需要注意的是:在指定物体位置然后在进行旋转操作时,经常会发生错误。因为旋转操作是围绕着旋转轴进行的,这时物体的位置就可能变化太大,从而超出摄像机的视野。
同样的,移动操作之后再进行大小操作,也会把物体移动到想象不到的位置。如果你先移动然后在大小,会导致,移动倍数效果。比如说

  translate <5, 6, 7>scale 4

上面的代码,将会移动到<20,24,28>而不是<5,6,7>

相反变换
  transform { scale <20,24,28> translate y*3 inverse }

一个相反变换,效果就是正常变换的对立面。可以用来取消一些变换,这样就可以不适用一大推的正常变换操作了。
当然,正常变换也可以达到inverse的效果,只需要改变其对立属性即可。比如说:translate y*3的对立可以为:translate -y*3

变换标识符

整合多个变换操作到复杂的场景中是非常有用的。一个变换标识符就可以达到这样的目的。变换标识符被声明成下面形式:

TRANSFORM_DECLARATION:#declare IDENTIFIER = transform{ TRANSFORMATION... } |#local IDENTIFIER = transform{ TRANSFORMATION... }

IDENTIFIER是标识符的名字,TRANSFORMATION是任何有效的变换操作,修改。具体例子如下:

  #declare MyTrans =transform {rotate THISWAYscale SOMUCHrotate -THISWAYscale BIGGERtranslate OVERTHERErotate WAYAROUND}

下面是上面定义的标识符的具体使用,括号可以省略。

  object {MyObject              // Get a copy of MyObjecttransform MyTrans     // Apply the transformationtranslate -x*5        // Then move it 5 units left}object {MyObject              // Get another copy of MyObjecttransform { MyTrans } // Apply the same transformationtranslate x*5         // Then move this one 5 units right}

如果在一个极端复杂的CSG物体上使用变换标识符,会比单独应用每一个变换指令快,这是因为,当再次使用标识符时,他已经是被编译过的了。当然是再次使用,速度会快,而不是初次使用。

纹理和物体的变换

当一个物体进行变换时,附着在物体上的纹理也会跟着变换。但是会有以下几种情况出现:如果现实变换操作(rotate、matrix、translate)在进行纹理设置,那么纹理是不会发生变换的。如果先进行纹理设置,在进行变换,那么纹理也会跟着变换。如果在纹理设置中进行变换操作,那么只会对纹理产生效果。

 sphere { 0, 1texture { Jade } // texture identifier from TEXTURES.INCscale 3          // this scale affects both the// shape and texture}sphere { 0, 1scale 3          // this scale affects the shape onlytexture { Jade }}sphere { 0, 1texture {Jadescale 3        // this scale affects the texture only}}

另外,变换操作还可以单独的应用到pigment,surfacenormal中,这样应用操作的同时,可能会影响到其他的一些因素。下面是一个例子:

 box { <0, 0, 0>, <1, 1, 1>texture {pigment {checker Red, Whitescale 0.25 // This affects only the color pattern}normal {bumps 0.3 // This specifies apparent height of bumpsscale 0.2 // Scales diameter and space between bumps// and also the height. Has no effect on// color pattern.}rotate y*45 // This affects the entire texture but}            // not the object.}

结束!

POV-RAY基础教程 - POV-Ray坐标系(7)相关推荐

  1. rraylist参数_教程:ray渲参数实例讲解(一)ray_controller的参数解析

    因为视频凉凉了,过来写下教程(xuan chuan shi pin) 让我们开始吧, 注意: 1.本教程仅会讲解常用参数,特殊作用的参数不会详细讲解. 2.本人对渲染器了解仅停留在会写光追的水平,如果 ...

  2. POV-RAY基础教程 - 相机(6)

    回到上一篇 POV-RAY基础教程 - 简单贴图/纹理设置(5) 使用焦点模糊 让我们构建一个简单的场景来说明焦点模糊的使用.对于这个例子,我们将使用粉红色球体,绿色框和蓝色圆柱体,球体放置在前景中, ...

  3. iOS 应用内购买基础教程 swift篇

    应用内购买基础教程 原文地址http://www.raywenderlich.com/105365/in-app-purchases-tutorial-getting-started 更新日志:本教程 ...

  4. DirectX12(D3D12)基础教程(外篇一)——编译Assimp

    目录 1.前言 2.Assimp库简介 3.编译Assimp库的准备工作 4.下载Assimp源码并编译 1.前言   D3D12系列教程因为我转移精力学习Nodejs.VueJs等技能,暂时中断了一 ...

  5. DirectX12(D3D12)基础教程(十)——DXR(DirectX Raytracing)基础教程(下)

    本文接上篇:DirectX12(D3D12)基础教程(十)--DXR(DirectX Raytracing)基础教程(上) 目录 5.C/C++代码中的其它准备工作 6.DXR编程的基本框架 7.枚举 ...

  6. POV-RAY基础教程 - CSG(3)

    构造型实体几何体(CSG)是一种可以组合原始对象以创建更复杂的对象的手段或者说方式,在上一篇介绍黄金链就已经用到了CSG方法. 回到上一篇 POV-RAY基础教程 - 基本SDL(2) 什么是CSG? ...

  7. (转)OpenLayers3基础教程——OL3基本概念

    http://blog.csdn.net/gisshixisheng/article/details/46756275 OpenLayers3基础教程--OL3基本概念 从本节开始,我会陆陆续续的更新 ...

  8. Canvas基础教程

    文章目录 Canvas 基础教程 canvas绘制矩形 canvas路径 canvas圆弧 贝塞尔曲线 二次贝塞尔曲线 三次贝塞尔曲线 绘制文字 canvas变换 背景图片 双缓存 canvas渐变 ...

  9. OpenLayers3基础教程——OL3基本概念

    从本节开始,我会陆陆续续的更新有关OL3的相关文章--OpenLayers3基础教程,欢迎大家关注我的博客,同时也希望我的博客能够给大家带来一点帮助. 概述: OpenLayers 3对OpenLay ...

最新文章

  1. Rook存储:Kubernetes中最优秀的存储
  2. Linux网络篇基础知识
  3. html float菜鸟,这些年,我们前端菜鸟遇到的坑(1)--CSS易错点--float、透明度、rem......
  4. 带有Jersey和Spring的RESTful Web应用程序
  5. android开发入门_Android开发入门
  6. 广西2021普通高考成绩查询,2021广西高考成绩什么时候出
  7. LSGO软件技术团队2015~2016学年第四周(0921~0927)总结
  8. JEECG 3.7.8 新版表单校验提示风格使用升级方法(validform 新风格漂亮,布局简单)
  9. python3 copy_Python3 深浅拷贝
  10. 电闹上赠么使用计算机,计算器怎么算n次方 怎么用电脑计算器算次方
  11. 如何将数据渲染到页面上?
  12. Oracle 10g Create Database
  13. C++_limits头文件
  14. 权限申请弹框_安卓Q | 位置权限三态化解析,用户要关心,开发者须警惕!
  15. Node.Js实现最最最简单的登录注册
  16. 从零开始学习UCOSII操作系统15--总结篇
  17. VScode Latex 拼写检查
  18. 计算机房应配置灭火器,下列哪种灭火器配置是正确的?
  19. 达人评测 联想小新Pro16和小米笔记本Pro15选哪个好
  20. 物联网是什么?_物联网怎么定义

热门文章

  1. 怎么输出链表最后一个元素_听说AI将是人类最后一个发明?听听他怎么说!
  2. HTTP请求OPTION方法
  3. 王思聪创办的熊猫直播将于3月8日正式关站,这会是直播行业的落幕吗?
  4. DC-DC PCB layout 指导
  5. 小米服务组件是什么东西_如何用小米智能家庭打造环境控制(温度、湿度、空气质量)...
  6. [Android开发常见问题-19] Android为什么比IOS和WP慢?
  7. noi题目P4206 [NOI2005] 聪聪与可可
  8. 计算机主板外频,笨鸟先飞 主板超频BIOS选项接触(图解)
  9. “新DeFi”生态的构建,流支付协议Zebec或厚积薄发
  10. 如何将SQL语句进行自动翻译