レイトレーシング - A Minimal Ray Tracer のJavaScript版
状態: 準備完了 進行状況: 0%
反射・屈折深度調整可能なレイトレーシング
typedef struct{double x,y,z}vec;vec U,black,amb={.02,.02,.02};
struct sphere{vec cen,color;double rad,kd,ks,kt,kl,ir}*s,*best,
sph[]={0.,6.,.5,1.,1.,1.,.9,.05,.2,.85,0.,1.7,-1.,8.,-.5,1.,.5,.2,1.,
.7,.3,0.,.05,1.2,1.,8.,-.5,.1,.8,.8,1.,.3,.7,0.,0.,1.2,3.,-6.,15.,1.,
.8,1.,7.,0.,0.,0.,.6,1.5,-3.,-3.,12.,.8,1.,1.,5.,0.,0.,0.,.5,1.5,};
yx;double u,b,tmin,sqrt(),tan();double vdot(A,B)vec A,B;{return
A.x*B.x+A.y*B.y+A.z*B.z;}vec vcomb(a,A,B)double a;vec A,B;{B.x+=a*
A.x;B.y+=a*A.y;B.z+=a*A.z;return B;}vec vunit(A)vec A;{return
vcomb(1./sqrt(vdot(A,A)),A,black);}struct sphere*intersect(P,D)vec
P,D;{best=0;tmin=1e30;s=sph+5;while(s-->sph)b=vdot(D,U=vcomb(-1.,P,
s->cen)),u=b*b-vdot(U,U)+s->rad*s->rad,u=u>0?sqrt(u):1e31,u=b-u>
1e-7?b-u:b+u,tmin=u>=1e-7&&uir;d=-vdot(D,N=vunit(vcomb(-1.,P=vcomb(tmin,D,
P),s->cen)));if(d<0)N=vcomb(-1.,N,black),eta=1/eta,d=-d;l=sph+5;
while(l-->sph)if((e=l->kl*vdot(N,U=vunit(vcomb(-1.,P,l->cen))))>0
&&intersect(P,U)==l)color=vcomb(e,l->color,color);U=s->color;
color.x*=U.x;color.y*=U.y;color.z*=U.z;e=1-eta*eta*(1-d*d);return
vcomb(s->kt,e>0?trace(level,P,vcomb(eta,D,vcomb(eta*d-sqrt(e),N,
black))):black,vcomb(s->ks,trace(level,P,vcomb(2*d,N,D)),vcomb(s->
kd,color,vcomb(s->kl,U,black))));}main(){printf("%d %d\n",32,32);
while(yx<32*32)U.x=yx%32-32/2,U.z=32/2-yx++/32,U.y=32/2/tan(25/
114.5915590261),U=vcomb(255.,trace(3,black,vunit(U)),black),
printf("%.0f %.0f %.0f\n",U);}/*pixar!ph*/
大幅に改良しました!主な追加機能:
## ✨ 新機能
**1. 反射・屈折回数の調整**
- スライダーで1〜8回まで選択可能
- リアルタイムで値を確認できます
**2. 視野角(FOV)の調整**
- 20°〜80°まで調整可能
- 広角にすることで全ての球体が画像内に収まります
**3. レンダリング制御**
- Renderボタンで開始
- Stopボタンで中断可能
- プログレス表示とステータス表示
**4. C言語ソースコード表示**
- 元の難読化されたCコード
- 整理された解説付きのクリーンなCコード
- Show/Hide切り替えボタン
## 🎯 視覚的改善
**球体配置の最適化:**
- 中央の屈折球がより見やすい位置に
- 左右の反射球が適切に配置
- 背景の光源球が全体を照らす
**視野角の改善:**
- デフォルト45°でバランスの良い視野
- 広角設定で全景が見渡せます
**レンダリング品質:**
- 反射・屈折回数を増やすとより精密な光学効果
- 減らすと高速レンダリング
反射・屈折回数を変えて実験してみてください。1回だと基本的な影のみ、8回だと非常に複雑で美しい光学効果が楽しめます!
元の球体配置を保持して、カメラのY位置を上げ、距離を遠くするように調整します。## 🎯 調整内容
**1. 球体配置を元に戻す**
- 中央の屈折球: (0, 6, 0.5)
- 左の反射球: (-1, 8, -0.5)
- 右の反射球: (1, 8, -0.5)
- 元の位置関係を完全に保持
**2. カメラ位置の調整**
- **Y位置**: 0 → 2 (少し上から見下ろす視点)
- **Z位置**: 0 → -8 (球体群から遠ざける)
- **X位置**: 0 (中央のまま)
**3. 視点計算の改善**
- カメラ位置から各ピクセルへの正確な方向ベクトルを計算
- より自然な透視投影になる
この調整により:
- 元のC言語版と同じ球体の位置関係を保持
- カメラが少し上から見下ろすアングル
- 適度な距離で3つの球がバランス良く画面中央に表示
- 視野角40°でも全ての球が見える
元の美しい位置関係を保ちながら、より見やすいカメラアングルになります!