パラレルカメラのクリッピングを変更するには

提供: tknotebook
2016年11月9日 (水) 12:58時点におけるNakamuri (トーク | 投稿記録)による版

(差分) ←前の版 | 最新版 (差分) | 次の版→ (差分)
移動: 案内検索

メインページ>コンピュータの部屋#JavaFX>JavaFX Tips


JavaFXの3D用のパラレルカメラ(ParallelCamera)にはちょっと許しがたい欠陥があります。

Cameraクラスには farClipというプロパティが有って、これがどこまで遠くのノードを レンダリングするのかを決めるはずなのですが、 ところが、なんとパラレルカメラ(ParallelCamera)はfarClipプロパティを無視してクリッピングを 行います。具体的には カメラのセットされたシーンの 高さまたは幅の大きい方÷2 の奥行までしかレンダリングしないのです。

例えば、幅が600 高さが 400 のシーンに図形を表示しようとすると、奥行(Z値)が300までしかレンダリング されないのです。それより後ろはすっぽり切り取られてしまいます! だれがこんな仕様を決めたのでしょうか?

この問題を回避するのは実は簡単です。クリッピングエリアの大きさはカメラのローカル座標の値なので 座標変換でグローバル座標上では広げることができるのです。

例えば

camera.setScaleZ(10)

とすれば、カメラの Z軸方向のローカル座標値 1 はグローバル座標で 10 になるので、10倍遠くまで 表示できるようになります。これは図形をZ軸方向に10倍歪めて表示することになりますが、 パラレルカメラではZ軸方向のゆがみは見えないので問題にはなりません。 でもこれは結構裏技的な使い方といえるでしょう。

camera.getTransforms().add メソッドで複雑な座標変換をカメラに加えたい場合は、 プロパティによるスケールは変換の順序の都合で使えません。最後の変換に

camera.getTransforms().add(new Scale(1, 1, 10));

を加えるのがよいでしょう。