1

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>
}

最後に、最小の実例があります。

ここで質問があります。グラデーションを適用して、ビーム オブジェクトのティップ コーンの色を変更したいと考えています。問題は、正弦関数 (傾斜角を決定するために使用される) の値に応じて勾配をシフトする必要があることです。

オブジェクト指向プログラミングから、次のようなものを書きます

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)これも機能しません (常に最初の位置を使用します...)。

誰でも私の問題に対するアイデア/解決策を持っていますか?

4

1 に答える 1

0
#declare mypos = calculate_position_function(i)

カスタム関数、特にベクトル値の関数を定義することは、povray ではやや直感的ではありません。参加してください。

http://povray.org/documentation/3.7.0/r3_3.html#r3_3_1_8_4


paradigmata、esp OO、POV-Ray について:

私はそれについて深く掘り下げません。一般的に、おそらくCSGを除いて、多くのアプリケーションロジックをPOV-Rayに委譲しないことをお勧めします.

POV-Ray の mesh2 は、3D パイプラインの優れたインターフェイスです。コーン、ボックスなどのプリミティブのメッシュは、C++ や python (numpy と組み合わせて使用​​する場合は後者の esp) などの汎用言語内からごくわずかな計算で簡単に生成でき、妥当な小さな労力でメッシュ 2 としてエクスポート (A) できます。

http://povray.org/documentation/3.7.0/r3_4.html#r3_4_5_2_4

または、より汎用性の高い方法として、任意のメッシュをカスタム XML 形式にエクスポートし、XSLT またはプログラムによって POV-Ray ソースに変換します (B)。

私の経験からすると、(A) の実装には約 1 営業日、(B) のコード作成には約 2 営業日かかりますが、その余分な 1 日は十分に費やされます。


とにかく、これはループで単純化された「ビーム」の束を生成します:

#include "colors.inc"
#declare BEAM_LENGTH = 200;
#declare CUT_RADIUS = 10;
#declare NUM_BEAMS = 11;

camera { 
    perspective
    location <0, 1.8, -100> 
    look_at  0
    up y
    angle 30 
}

sky_sphere {
    pigment {
        color Blue
    }
    emission rgb <0.5,0.5,1>
}

light_source { 
    <0, 100, -100>, 
}

plane { 
    +y, 0 
    texture {
        pigment { color Green }
    }
}


#declare Beam =  cone  { 
    // top
    0, 0,
    // bottom
    -y * BEAM_LENGTH, CUT_RADIUS
}

#for (i, 0, NUM_BEAMS-1, 1)
    #declare q = i/NUM_BEAMS;
    #declare r = 100;
    #declare theta = pi/8; 
    #declare phi = q*2*pi;
    #declare pos = <r*sin(theta)*cos(phi), r*cos(theta), r*sin(theta)*sin(phi)>;

    #switch (mod(i,3))
        #case (0) 
            #declare d = <q,.1,.1,0>; 
        #break
        #case (1) 
            #declare d = <.1,q,.1,0>;  
        #break
        #case (2) 
            #declare d = <.1,.1,q,0>;  
        #break
    #end // switch

    object { Beam
        translate pos
        texture {
            pigment {
                rgbt d + <0,0,0,q/2>
            }
        }
    }
#end // for
于 2014-06-20T08:52:36.090 に答える