POV-Rayの簡単なオブジェクト

# はじめに
これは [POV-Rayによる数学お絵かき入門 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/povray4math) の2日目の記事です.


昨日の記事では

```Povray:HelloWorld.pov
background{rgb<1,1,1>}
sphere{<0,0,1>,0.2}
```

を実行しました.
今日の記事ではカメラと光源の設定の例と簡単なオブジェクトについて記述します.

# カメラと光源
簡単なオブジェクトの紹介の前に, まずはカメラや光源について少し解説します.

```Povray:SimpleObjects1.pov
camera{
    location <4,2,4>
    look_at <0,0,0>
}
light_source{
    <2,3,4>
    color rgb<1,1,1>
}
background{rgb<1,1,1>}

sphere{<0,0,1>,0.2}
```

これを実行すると次の画像が出力されます.
![](https://i.imgur.com/tAGAB7X.png)


## 解説
カメラの情報は`camera{ }`で記述します.
ここではカメラの位置を$(4,2,4)$, 視線の先を原点$(0,0,0)$に指定しています.
カメラの位置と向きが変わったために前回とは別の画像が出力されました.
カメラの設定パラメータには他にも幾つか存在しますが, これについては次回以降にします.

光源の情報は`light_source{ }`で記述します.
ここでは位置$(2,3,4)$からの白色光を指定している.
しかし物体の色はデフォルトで黒なので光を反射していません.
光源が意味を持つのは物体の色が指定された場合となります.

# 簡単なオブジェクト
さて本題です.
以降では簡単なオブジェクトとして

* 球面`sphere`
* 円柱 `cylinder`
* 直方体 `box`
* トーラス `torus`
* 三角形 `triangle`
* 多角形 `polygon`
* 円板 `disc`

を紹介します.

ここでの内容は公式ドキュメントの次の項目に相当します.
http://www.povray.org/documentation/3.7.0/r3_4.html#r3_4_5_1

入門障壁を考えれば日本語の資料が好ましく, 網羅的に書くよりは先ず簡単なオブジェクトを紹介しよう, というのが今回の趣旨です.

## 球面
球面を描くには次のような形式で中心の座標と半径を指定します.

```
sphere{<Center>,Radius}
```

## 円柱
円柱を描くには次のような形式で両端点と半径を指定する.

```
cylinder{<Base_Point>,<Cap_Point>,Radius}
```

#### 注意

* 両端点が一致した場合はエラーとなり, レンダリングが中止される.

### 具体例
球面と円柱を合わせた例を次に示します.

```Povray:SimpleObjects2.pov
camera{
    perspective
    location <2,1,2>
    look_at <0,0,0>
}
light_source{
    <2,3,4>
    color rgb<1,1,1>
}
background{rgb<1,1,1>}
sphere{<0,0,0>,0.2}

cylinder{<0,0,0>,<1,0,0>,0.1 pigment{rgb<1,0,0>}}
cylinder{<0,0,0>,<0,1,0>,0.1 pigment{rgb<0,1,0>}}
cylinder{<0,0,0>,<0,0,1>,0.1 pigment{rgb<0,0,1>}}
```

出力画像は次です.
![](https://i.imgur.com/hyJvdSF.png)

### 解説
先に説明すべきだったかも知れませんが, オブジェクトの指定の`{ }`の最後に`pigment{ }`を書く事で色の指定が出来ます.
ここでは$x$方向を赤色, $y$方向を緑色, $z$方向を青色に指定しています.

この出力画像より, POV-Rayのデフォルトでは$(x,y,z)$空間において$y$軸が鉛直方向であり, 座標系は左手系である事が分かります.

数学のお絵かきでは, $z$軸が鉛直方向で座標系は右手系である方が都合が良い場合が殆どです.
このためには`camera{ }`内にパラメータを書き加えれば可能ですが, 解説は第4回を予定しています.


## 直方体
直方体を描くには次のような形式で2つの対蹠点の座標を指定します.

```
box{<Corner_1>,<Corner_2>}
```

#### 注意

* 始点と終点が一致した場合は描画されない

### 具体例
以降の具体例では座標軸の方向が分かるように, 先の例の後に付け加えたものとします.
POV-Rayの座標の指定では通常の四則演算が可能です.

```
box{<0,2/3,0>,<1,1/3,-1/2> pigment{rgb<0,1,1>}}
```

![](https://i.imgur.com/wQfPi1z.png)


## トーラス
トーラスを描くには次のような形式で2つの半径を指定します.

```
torus{Major,Minor}
```

### 具体例

```
torus{1.5,0.25 pigment{rgb<1,0,1>}}
```

![](https://i.imgur.com/yBuSBZb.png)


## 三角形
三角形を描くには次のような形式で3つの頂点の座標を指定します.

```
triangle{<Corner_1>,<Corner_2>,<Corner_3>}
```

### 具体例

```
triangle{<1.1,0,0>,<0,1.1,0>,<0,0,1.1> pigment{rgb<0.5,0.5,0.5>}}
```

![](https://i.imgur.com/O6wCEjn.png)

## 多角形
多角形を描くには次のような形式で頂点数$n$と$n$個の頂点の座標を指定します.

```
polygon{Number_Of_Points,<Point_1>,<Point_2>,...,<Point_n>}
```

#### 注意

* 始点と終点の一致の必要はない
* 頂点が同一平面上に無い場合は描画されない

### 具体例

```
polygon{4,<1.1/3,1.1/3,1.1/3>,<1.1,0,0>,<0,1.1,0>,<0,0,1.1> pigment{rgb<0.5,0.5,0.5>}}
```

![](https://i.imgur.com/aDreott.png)

## 円板
円板を描くには次のような形式で中心座標, 法線方向, 半径を指定します.

```
disc{<Center>,<Normal>,Radius}
```

#### 注意

* `disk`ではない
* 法線ベクトルの長さは規格化されている必要は無い
* 法線ベクトルの長さが0であれば描画されない

### 具体例

```
disc{<0,1,0>,<1,1,0>,1/2 pigment{rgb<1,1,0>}}
```

![](https://i.imgur.com/ZpBItef.png)

## 今後の記事
### torusの対称軸の傾き
さて, `disc`は法線方向の指定が出来ましが, `torus`は2つの半径しか指定できませんでした.
`torus`も対称軸の向きを傾けたい, というのは自然な要求です.
これを実現するには第7回に記述予定の`rotate`を使います.

### 他のオブジェクト
POV-Rayが用意しているオブジェクトは他にも色々あるので, それについてはもう少し後で改めて書こうと思います.