投稿

ラベル(レイトレーシング)が付いた投稿を表示しています

二次曲面とトーラス(torus) (2回目)

2022/12/5(月) 二次曲面とトーラス (2回目)   トーラス(torus)は四次方程式なので 4次方程式の解(フェラーリの公式) の求め方の解説です   Quartic equation ax 4  + bx 3  + cx 2  + dx 2  + e = 0を解く   変形 B = b/a, C = c/a, D = d/a, E = e/aと置くと x 4  + Bx 3  + Cx 2  + Dx + E = 0   ここで x = X - B/4と置くと(X 3 の項を消すため) x 4  + Bx 3  + Cx 2  + Dx + E = (X-B/4) 4 +B(X-B/4) 3 +C(X-B/4) 2 +D(X-B/4)+E = X 4  - 4X 3 (B/4) + 6X 2 (B/4) 2  - 4X(B/4) 3  + (B/4) 4   + BX 3  - 3BX 2 (B/4) + 3BX(B/4) 2  - B(B/4) 3   + CX 2  - 2CX(B/4) + C(B/4) 2   + DX - DB/4 + E = X 4  + (-B + B)X 3  + {6(B/4) 2  - 3B(B/4) + C}X 2   + {-4(B/4) 3  + 3B(B/4) 2  - 2C(B/4) + D}X + {(B/4) 4   - B(B/4) 3  - D(B/4) + E} = X 4  + {6(B/4) 2  - 12(B/4) 2  + C}X 2   + {-4(B/4) 3  + 12(B/4) 3  - 2C(B/4) + D}X + {(B/4) 4  - 4(B/4) 4  - D(B/4) + E} = X 4  + {-6(B/4) 2  + C}X 2   + {8(B/4) 3  - 2C(B/4) + D}X + {-3(B/4) 4  - D(B/4) + E}   s = B/4 p = -6s 2  + C q = 8s 3  - 2Cs + D r = -3s 4  - Ds + E と置くと X 4  + pX 2  + qX + r = 0   q = 0の時、(X 4  + pX 2  + r = 0) X 2  = {-p±√(p 2 -4r)}/2 X = ±√[{

N88-BASICでレイトレーシングの動画

イメージ
2022/11/20(日) N88-BASICでレイトレーシングの動画   N88-BASICでレイトレーシングのプログラムを NL-BASIC ver0.0028k で動かして 速度を計ってみました レイトレーシングのプログラムを発表した時点の バージョンのNL-BASICと比べて実行速度が 速くなっています   以下のレイトレーシングで 描画時間表示が出来るようにしで動画を撮りました   https://ulprojectmail.blogspot.com/2021/06/n88-basic-8.html N88-BASICでレイトレーシング (8回目)   ray008.bas 1480 TIME$ = "00:00:00": GOSUB *RAY.TRACE: PRINT TIME$   https://ulprojectmail.blogspot.com/2021/09/n88-basic256.html N88-BASIC(256色)でレイトレーシング   ray201.bas 1690 TIME$ = "00:00:00": GOSUB *RAY.TRACE: PRINT TIME$   PC-9821の256色モードにつていは Neko Project 21/W(PC-9821エミュレータ)の作者の SimK 様 に いろいろと教えて頂きました   N88-BASIC互換?VL,NL,XL-BASICとblg~.zip(~.bas)は 以下のリンクからダウンロードできます https://ulprojectmail.blogspot.com Readme.txtを読んで遊んで下さい  

VL-BASICでコーン

イメージ
2022/6/8(水) VL-BASICでコーン   VL-BASICの拡張命令でコーンを表示します   下記LISTの、*CONEからが、 コーン描画のサブルーチンです   GPU PRIM(CONE, a, b, c) はz座標がcのときx,y座標がa,bの 楕円錐を表示します z座標は正負両方向、つまり原点が頂点の 楕円錐が2個表示されます   GPU MATRIX(MODE, MODEL) は行列をモデルモードにします MODELモードは物体を動かし、 VIEWモードは視点を動かします TEXモードはテクスチャーの貼付け 座標を移動します   GPU MATRIX(MODE, PREVIOUS) は行列のモードを1つ戻します (戻せるのは直前の1回のみです)   GPU MATRIX(PUSH)は行列の保存 GPU MATRIX(POP)は保存した行列を戻す   GPU TRANSLATE(0, 0, HIGH / 2) GPU PRIM(OP, AND) GPU PRIM(PLANE, HIGH / 2) 円錐の高さの半分のz座標から高さの 半分の距離の両平面を、円錐とAND します 円錐を2平面で切るイメージです   GPU PRIM(OP, NAND) GPU PRIM(CONE, INNER, INNER, HIGH) 出来た円錐と、内側の円錐を裏表反転 したものをANDします NANDはNOTしてANDします これで立体的なコーンの完成です   テキスチャーを使用しない場合は TEX座標を移動する必要はありません 移動せずにテクスチャーを貼ると 境界がずれます   GPU MATERIAL(TEX, "Sky") この行でエラーが出るときは Sky.bmpが存在する場所に CHDIRしてから走らせて下さい   因みに画面にドラッグ&ドロップ すると、自動でCHDIRされます   VL-BASIC、とblg~.zip(cone001.bas)は このブログ(以下のリンク)から ダウンロードできます https://ulprojectmail.blogspot.com Readme.txtを読んで遊んで下さい

N88-BASICでRayTracingのしくみ

イメージ
2022/5/12(木) N88-BASICでRayTracingのしくみ   通常レイトレーシングは3次元空間に視線を飛ばし、 見えたものを2次元スクリーンに描画しますが、 2次元平面に視線を飛ばし、見えたものを1次元 スクリーンに描画する事で、レイトレーシングの しくみを視覚化しました   今回は、プログラムを単純化する為、光源などは無しに していますが、光源、反射、透過ありの、3次元 レイトレーシングについては、 ブログの https://ulprojectmail.blogspot.com/2021/06/n88-basic-1.html N88-BASICでレイトレーシング (1回目) ~(8回目) を読んで下さい   ます、視点から円までの距離を求めます ここで、数値(スカラー)を小文字、ベクトル (x,y成分を持つ矢印)を大文字で描くこと にします   P:任意の位置ベクトル r:円の半径 V:視点の位置ベクトル E:視線の方向単位ベクトル t:任意の値   とします位置ベクトルPは点Pと同じような ものだと思って下さいEは方向を表し、単位 ベクトルは距離(矢印の長さ)が1のベクトルで、 |E| = 1と書きます|E|はEベクトルの長さです   原点が中心で半径rの円は、 |P| = r で表されます 原点から点Pまでの長さがrの点の集まりです ので、円になります   視点VからE方向に向けた視線は、 P = V + Et で表されます   任意の場所にある円は、中心の位置を点Cとすると、 |P - C| = rとなりますが、視線の方は視点が 移動してもP = V + Etと変わりませんので、 球と視線を移動して円を原点に持ってくれば、 |P| = rの式で求めることができます よって、|P - C| = rは必要ありません   |P| = r P = V + Et   この式から視点と円間の距離tを求めます |P| = r にP = V + Etを代入します |V + Et| = r    | |を外すため両辺を2乗 (V + Et)(V + Et) = r 2  を展開 V・V + 2(V・E)t + (E・E)t 2  = r 2 ここでベクトル同士の積は内積になります E・E = |E||E| = 1×1 = 1 同じベクトルの内積はベクトルの

二次曲面とトーラス

イメージ
2022/4/20(水) 二次曲面とトーラス   レイトレーシングで使えるプリミティブ 球、二次曲面、トーラス(torus)を紹介します 各プリミティブまでの距離tを求める式と プリミティブ上の点P(x,y,z)での法線方向 ベクトルFの式を 最後尾の1.~5.の図に載せています   以下、1.~5.の式の説明です   ここではベクトルv(上に矢印)をV(大文字)で表す事にします   1. 始点Vから視線単位ベクトルE方向に見た 原点が中心の半径rの球までの距離tを求める   (原点が中心以外の球は、球と始点を平行移動 させ中心を原点に持ってくれはよい)   球はx 2 +y 2 +z 2 =r 2  で表せます ベクトルP=(x,y,z)で表すと |P|=x 2 +y 2 +z 2  なので |P|=r です (位置ベクトルPの長さがrの位置の集まり)   始点Vから視線(単位ベクトル)E方向に見た |P|=r までの距離tを求められれば 交点も分かり、 レイトレーシングに必要な値を計算できます (法線ベクトルは中心から交点の方向です)   詳しくは、 https://ulprojectmail.blogspot.com/2021/06/n88-basic-1.html N88-BASICでレイトレーシング (1回目) ~で解説しています   2. 二次曲面の場合 二次元の場合は x 2 /1 2  + y 2 /1 2  = 1が円 x 2 /a 2  + y 2 /b 2  = 1が楕円 x 2 /a 2  - y 2 /b 2  = 1が双曲線 のように、a,bの値やa 2 ,b 2 の符号によって 形がかわります   法線は x 2 /a 2  + y 2 /b 2  + z 2 /c 2  = 1を f(x,y,z) = 0の形に変形し f(x,y,z) = x 2 /a 2  + y 2 /b 2  + z 2 /c 2  - 1 とすると 法線方向(勾配) grad f = (∂f/∂x,∂f/∂y,∂f/∂z) ∂f/∂xは偏微分で、fをxの関数とみなして xで微分することです ∂f/∂x = (d/dx)(x 2 /a 2  + y 2 /b 2  + z 2 /c 2  - 1) = 2x/a 2   よって (2x/a 2 ,2y/b 2 ,

N88-BASIC(88)でレイトレーシング

イメージ
2022/2/10(木)   N88-BASIC(88)でレイトレーシング   PC-8801でレイトレーシングしました   https://ulprojectmail.blogspot.com/2021/06/n88-basic-1.html N88-BASICでレイトレーシング (1回目) ~(8回目) の ray008.bas(PC-9801用640×400×8色)を PC-8801用(640×200×8色)に変更しました   XL-BASIC(Alt+6で高速化)で動きます   1390 A = 4 の4を2や1にすると、解像度が上がります 動画はA = 4、静止画はA = 1で実行した結果です   XL-BASICとblg~.zip(ray301x.bas)は 以下のリンクからダウンロードできます https://ulprojectmail.blogspot.com Readme.txtを読んで遊んで下さい  

N88-BASIC(256色)でレイトレーシング

イメージ
2021/9/10(金) N88-BASIC(256色)でレイトレーシング for VL-BASIC,NL-BASIC,N88-BASIC(PC-9821) by ULproject   N88-BASICでレイトレーシング (1~8回目) をN88-BASIC(256色)で描画するようにしました 1677万7216色から選ぶと256色で足りなくなるので 4096色中256色を選んで描画しています PC-9821(またはVL-BASIC)の 1677万7216色中256色 モードで描画しています   パレット番号0~255の内 0~7を8色モードと同じ色に設定 (VL-BASICは0~15が16色モードの色に設定されて いて使うかもしれないので変更していません) 16:黒 17~255:初めて出てきた色を順次設定 という様に使用しています  プログラム中のN88の値によって N88 = 0でVL-BASIC用(ray201v.bas) N88 = 1でNL-BASIC用(ray201n.bas) N88 = 2でPC-9821用(ray201.bas) の動作をします (NL-BASICが遅いのでN88 = 1では 画面クリアを省略しています)   VL-BASIC,NL-BASICとblg~.zip (ray201v.bas, ray201n.bas, ray201.bas)は このブログ(以下のリンク)から ダウンロードできます https://ulprojectmail.blogspot.com Readme.txtを読んで遊んで下さい  

VL-BASICで動くレイトレーシング (3回目)

イメージ
2021/7/18(日) VL-BASICで動くレイトレーシング (3回目)   by ULproject   VL-BASICの拡張命令でレイトレーシングです CPUのみの計算で動いています   フォトンマッピングによる集光模様を表示してみました 移動はブースター方式 (宇宙船を操作している感覚)にし 裸眼立体視も表示してみました   blg~.zip(mray003v.bas)は 以下のリンクからダウンロードできます VL-BASIC(N88-BASIC互換?)ホームページ Readme.txtを読んで遊んで下さい   操作方法は hキーで表示されます

VL-BASICで動くレイトレーシング (2回目)

イメージ
2021/7/14(水) VL-BASICで動くレイトレーシング (2回目)   by ULproject   VL-BASICの拡張命令でリアルタイムレイトレーシング です CPUのみの計算で動いていますので コア数 (32スレッドまで)が多いほど速くなります   雪だるまとトーラス (ドーナツ)と鏡を配置し 移動はブースター方式 (宇宙船を操作している感覚)にし 裸眼立体視も表示してみました   blg~.zip(mray002v.bas)は 以下のリンクからダウンロードできます VL-BASIC(N88-BASIC互換?)ホームページ Readme.txtを読んで遊んで下さい   操作方法は hキーで表示されます

VL-BASICで動くレイトレーシング

イメージ
2021/7/10(土) VL-BASICで動くレイトレーシング   by ULproject   HTMLで動くレイトレーシング   を VL-BASICの拡張命令で作ってみました   VL-BASICは行列による移動になりますので mray003.html が一番近いです (VL-BASIC拡張命令では点の大きさの変更には 対応していませんので省略しています )   以下、モデル (球)の配置の説明 mray003.htmlのModel関数と同じように作りました   *MODEL GPU MATERIAL(PUSH) GPU MATRIX(MODE, MODEL) ' GPU MATERIAL(SPECULAR, 1.0, 1.0, 1.0) GPU MATERIAL(SHININESS, 10.0) GPU MATERIAL(REFLECT, 0.0, 0.0, 0.0) GPU MATERIAL(CLARITY, 0.0, 0.0, 0.0) GPU MATERIAL(REFRACT, 1.0) ' 光源 GPU MATERIAL(LIGHT    , 1.0, 1.0, 1.0) '--- 光源の光の色と強さ GPU MATERIAL(ATTENUATE, 1.0, 0.0, 0.0) '--- 光減衰(0,1,2乗の係数) GPU MATERIAL(DIFFUSE, 1.0, 1.0, 1.0) GPU MATRIX(PUSH) GPU TRANSLATE(-500, 500, 500) GPU SPHERE(2) GPU MATRIX(POP) GPU MATERIAL(LIGHT    , 0.0, 0.0, 0.0) '--- 光源の光の色と強さ ' 大球 GPU MATERIAL(DIFFUSE, 0.0, 1.0, 1.0) GPU MATRIX(PUSH) GPU TRANSLATE(3, 8, -80) GPU SPHERE(18) GPU MATRIX(POP) ' 小球 GPU MATERIAL(DIFFUSE, 1.0, 1.0, 0.0) GPU MATRIX(PUSH) GPU TRANSLATE(-6, 14, -60) GPU SPHERE(6) GPU MATRIX(P