我正在尝试使用 POV-ray 制作场景,我想制作几个相同类型但位置、旋转和颜色不同的对象。我想做的对象看起来像
#declare Width = 30;
#declare Length = 120;
#declare Thickness = 4;
#declare TipHeight = 17;
// Single Beam------------
#declare Beam = union{
// beam
box {
<-Width/2, TipHeight, 0>,
< Width/2, TipHeight+Thickness, Length>
}
//Triangle head
prism { TipHeight TipHeight+Thickness , 4
<-Width/2, Length>,
< Width/2, Length>,
< 0, Length+Length/8>,
<-Width/2, Length>
}
// tip
cone {
<0, 0, Length>, 0
<0, TipHeight, Length>, TipHeight/2
}
}
我接下来要做的是创建几个这样的光束对象作为
// Sine formed beams--------------
#declare EndValue = 20;
#declare MaxTranslation = 100;
#declare MaxRotation = 10; //degrees
#declare BeamsSine = union{
#for (Cntr, 0, EndValue, 1)
#local NormalizedValue = Cntr/EndValue;
object {Beam
rotate y*90
rotate -z*sin(NormalizedValue*2*pi)*MaxRotation
translate z*NormalizedValue*MaxTranslation
texture { pigment {
color Gray
}
}
}
#end
}
#include colors.inc
在最开始添加和
object{ BeamsSine no_shadow }
light_source { <500, 50, 300> color White}
camera {
location <400, 100, 300>
look_at <0, 0, 0>
}
最后你有一个最小的工作示例。
现在是我的问题:我想通过应用渐变来更改 Beam 对象中尖端锥体的颜色。问题是梯度应该根据正弦函数的值(用于确定倾斜角)进行移动。
从面向对象编程,我会写类似
class MYBEAM(position):
...make the beam
cone {
<0, 0, Length>, 0
<0, TipHeight, Length>, TipHeight/2
pigment{ gradient{cmap_depending_on_variable_"position"} }
}
然后将每个对象创建为
for i = 1:10
pos = calculate_position_function(i)
MYBEAM(pos)
...
end
我不知道如何在 POV-ray 中做到这一点!我没有设法将额外的参数传递给我的光束对象。我能想到的唯一方法是使用函数声明方法,但它不能返回一个对象?(我只设法让它返回一个浮点数)。
我还尝试#declare mypos = 55;
在定义我的对象之前创建一个变量,然后在每个循环中通过重新定义它来更新它,就像#declare mypos = calculate_position_function(i)
在创建新对象之前一样。这也不起作用(总是使用第一个位置......)。
有人对我的问题有一些想法/解决方案吗?