3
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

レイをトレースしたい。 第一回 準備

Posted at

Ray Tracing in One Weekend を勉強しつつ、自作のレイトレをしてみたいなという記事です。
https://www.amazon.co.jp/Tracing-Weekend-Minibooks-Book-English-ebook/dp/B01B5AODD8

内容としては大体沿いつつ、実装自体は割と我流でやっていこうと思います。

使用言語はC++です。

Eigenのダウンロード

ベクトルや行列の計算が多々出てくるので、C++のヘッダであるEigenを利用します。
Eigenは高速ながらコンパイルがいらないので、パスを通すとか考えなくても使えるのが良いです。

こちらの公式サイトからダウンロード、回答したあとEigenフォルダをソースとおなじところに置きます。
これでincludeを叩くだけで行列やベクトルが扱えます。

画像の表示

ビットマップを扱うのは意外とヘッダの書き込みがあったりして面倒なので.pnm形式を利用します。pnm形式はめちゃくちゃ簡単で、

.pnm
P3  //フルカラーの意味
512 512 //height, width
255 //RGBの最大値
R G B
R G B
R G B
・
・
・

RGBの配列をpnmファイルに書き出す関数を用意しました。

void write_ppm(vector<vector<vector<int>>> pic){
    ofstream out;
    out.open("test.pnm");
    out << "P3" << endl;
    out << pic.size() << " " << pic[0].size() << endl;
    out << 255 << endl;
    for (int i = 0 ; i < pic.size(); ++i){
        for (int j = 0; j < pic[0].size(); ++j){
            out << pic[i][j][0] << " " << pic[i][j][1] << " " << pic[i][j][2] << endl;
        }
    }

}

これだけです。簡単ですね。
この形式で書き込むだけで画像ファイルができます。ただこれを直接開けるエディタは限られているので、pngファイルとかに変換します。変換にはimagemagickを使用し

convert hoge.pnm -scale 512x512 hoge.png

のようにコマンドを叩くだけで変換してくれます。

第一回のソース

インクルードとか思いつく定数とかを定義したのが以下になります。

#include <bits/stdc++.h>
include "Eigen/Core"
using namespace std;
using namespace Eigen;


const double PI = 3.141592653589793238;
const double PI2 = 6.28318530718;
const double eps = 1e-6;

void write_ppm(vector<vector<vector<int>>> pic){
    ofstream out;
    out.open("test.pnm");
    out << "P3" << endl;
    out << pic.size() << " " << pic[0].size() << endl;
    out << 255 << endl;
    for (int i = 0 ; i < pic.size(); ++i){
        for (int j = 0; j < pic[0].size(); ++j){
            out << pic[i][j][0] << " " << pic[i][j][1] << " " << pic[i][j][2] << endl;
        }
    }

}

int main(void){
    int height = 512;
    int width = 512;
    pic = vector<vector<vector<int>>>(height,vector<vector<int>>(width,vector<int>(3,150)));
    write_ppm(pic);
    return 0;
}

実行するとグレーの画像が出てきます。
image.png

3
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?