質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

3DCG

コンピュータの演算により、3次元空間の仮想物体を、2次元平面上で表現する手法である。

Q&A

解決済

2回答

1322閲覧

「ゲームプログラマになる前に覚えておきたい技術」という本の内容についての質問

aaaaaaaaaaa

総合スコア13

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

3DCG

コンピュータの演算により、3次元空間の仮想物体を、2次元平面上で表現する手法である。

1グッド

1クリップ

投稿2016/08/27 04:40

「ゲームプログラマになる前に覚えておきたい技術」
という本の
P374の「zバッファの範囲問題」
というところについて質問なのですが
「zに0やマイナスの値が入る頂点は全て範囲外であり、
描画の対象外となる。
つまり、問題は起きない」
という箇所について

zの範囲変換をすると0除算が起きなくなるといった様な事が書かれていると思うのですが
なぜ問題が起きないのでしょうか?

zの範囲変換をした後にzバッファの値が0から1の間でない頂点の
xとyはzで割らない
と言った処理をしているのであれば
わかるのですが

P375のサンプル(P375のコードのところ)だと
zの範囲変換の前に
xとyがzで割られているのでこの時点で0除算が起きるのではないのですか?

ということと

私が変な解釈をしているかもしれいないので
この辺りを勘違いしているのではないかと言ったようなことがあれば
よろしくお願いします

回答お願いします

###発生している問題・エラーメッセージ

エラーメッセージ

###該当のソースコード

ここにご自身が実行したソースコードを書いてください

###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

kobaya_c👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

z範囲変換をして
zバッファの値が0から1以外の場合は
xとyをzで割らないようにする処理が必要という
解釈でよろしいでしょうか

今本文を読み返してみましたが、除外する必要は無いようです
1~10000以外の値が入っていても、計算や表示には何も問題ないようです
完全に自分の解釈ミスです 申し訳ありません

投稿2016/09/03 15:47

samamoto1205

総合スコア20

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aaaaaaaaaaa

2016/09/04 02:43

回答ありがとうございます >除外する必要は無いようです 1~10000以外の値が入っていても、計算や表示には何も問題ないようです なぜ 1~10000以外の値が入っていても なぜ問題がおきないのかという事が聞きたいのです すみません 頂点のz座標に1~10000以外の値が入っている(zバッファが0から1以外の値になる)場合 は x/z y/z を計算する時に 0除算が起きるのではないでしょうか
samamoto1205

2016/09/04 06:49

問題が起きないのは範囲変換の時ってのは間違いないですが、割り算の時は・・・ やっぱり想定外の数字に関しては条件分岐要りますかね?(汗 本の文章がわかりづらくて、答えが右往左往してしまいますすいません 一回自分用の意味も兼ねてまとめます ・zには「1~10000」までが入っていることが前提とする   0による除算が行われず「問題が起きない」 ・範囲変換によって1~10000を0~1に変換する   zに入っているのが1~10000である場合は0~1になって「表示される」   それ以外の場合は範囲外になるため「表示されない」という状況になって「問題ない」 zに0が入って問題ないのは範囲変換の時で、割り算の方には問題があるのですが、そのあたりがあいまいになってるみたいですね・・・ 「範囲変換をするときにはzに0やマイナスが入っていても表示には関係ない」っていうのと「割り算の時にはzに0は入らないので計算には問題ない」っていうのがごちゃごちゃになっていて、「0で割り算しても問題ない」みたいな解釈ができてしまう文脈になっているのだと思います。 範囲変換は「0で割り算が発生しないようにする」目的と「0が入っていても問題ない」zバッファの特徴をいかしているものである、ということなので、少なくともこのコードの場合はzに0が入らないようにするのが正解だと思います。 相反する特徴をまとめて扱ったために生じた言葉の矛盾、といったところでしょうか。 なので、 zに1~10000以外の数字が入る可能性を考慮したコードはzバッファの特徴的に問題ないが、その場合は0が入る可能性に関しては割り算の問題があるので排除した方が良い ということでいいと思います。 「zに0が入っていても範囲変換には問題ない」が「0で割り算しないようにする」というのと矛盾してしまうので生じる混乱ですね・・・^^;
aaaaaaaaaaa

2016/09/05 05:05

そもそもzの表示範囲を変えるのは 頂点のz値を直接zバッファに使うと ( DrawTriangle3D関数の 第一引数にz割をした後のx 比に引数にz割をした後のy 第三引数に0から1のzバッファの値 を 渡すようになっている ) 表示されるzの範囲が0から1では(zバッファの範囲と同じでは) 0が含まれている可能性があり 表示する以上は 表示する範囲の x/z y/z を計算しなければならない だから表示する範囲に0が含まれない範囲(1から10000)にして いるのはわかるのですが ( 頂点を計算(x、yをzで割る)するときはzの値は1から10000で DrawTriangle3D関数にzバッファを渡すときはzの値は0から1 ) 表示されない範囲の xやyはzで割られないようにする処理がいると思うのです (3Dでは表示されない範囲の頂点も存在する場合がある) しかし サンプルのコードではこのzで割られないようにする処理がかかれていないのです ( サンプルではzの値を予め決めているのでzで割られないようにする処理は 「このサンプルでは」必要ないのですが 予め決められていない場合など(カメラの移動で座標が変わる場合)はこれでは0除算が起きる可能性があると思うのです ) z範囲変換をしただけでは 0除算を避ける事はできないと思うのです 自分の解釈-------------------------------------------- サンプルのコードはz範囲変換をするためだけのコードで 0除算を避ける事がいいたいのではない 「zバッファの範囲問題」 という箇所では 範囲変換をして zバッファの値が0から1以外の頂点は表示しない処理がいる という事が言いたいのでしょうか
aaaaaaaaaaa

2016/09/05 05:28

↑ 訂正 × zバッファの値が0から1以外の頂点は表示しない処理がいる 〇 zバッファの値が0から1以外の頂点のx、y座標はz座標で割られないようにする処理がいる
samamoto1205

2016/09/05 05:50

このサンプルは、「表示される範囲の計算」しか考えていないので、「表示されない範囲の計算」をしたい場合は当然そのための処理が必要になります。 実際数ページ読み進めてもらえれば、「表示されない範囲の計算」について書いてあります(カメラ移動などを考えた計算) つまりこのコードは「3D表示の計算の途中段階」で、「見えている範囲の範囲変換についての説明と使い方」をひとまず紹介しているだけなので色々足りてなくて当然なわけです
aaaaaaaaaaa

2016/09/05 06:18

↑ 訂正 × サンプルのコードはz範囲変換をするためだけのコードで 0除算を避ける事がいいたいのではない 〇 サンプルのコードではz範囲変換をすれば 表示される範囲の頂点にz値が0の頂点が含まれない ということを言っていて 表示される範囲外の頂点のx、y座標をz座標で割る事までは考えていない (値が予め決められている為)
aaaaaaaaaaa

2016/09/05 06:26

回答ありがとうございます >このサンプルは、「表示される範囲の計算」しか考えていないので、「表示されない範囲の計算」をしたい場合は当然そのための処理が必要になります。 それが聞きたかったのです ありがとうございます とても助かりました 何度も解答してくださりありがとうございました
samamoto1205

2016/09/05 06:45

いえいえ こちらこそ見当違いな解答を繰り返していたみたいで申し訳ありません ご理解いただけたみたいで何よりです
guest

0

zの範囲変換をすると0除算が起きなくなるといった様な事が書かれていると思うのですが
なぜ問題が起きないのでしょうか?

そもそもzに0が入らないようにしてあるからです。

zの値に、110000を入れることを前提としているので、割り算をした時点ではzには110000が必ず入っており0での割り算が行われないようになっています。

初期値に0が入る可能性を想定したプログラムであれば、条件式で0を除外するなどの処理が必要でしょうが、このコードの場合0が入らないことを前提としている(値を自分で決めている)ので、この場合は除外する式を記入していない(する必要がない)、ということだと思います。

投稿2016/09/02 08:42

samamoto1205

総合スコア20

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aaaaaaaaaaa

2016/09/03 06:39 編集

「zバッファの範囲問題」のところで
aaaaaaaaaaa

2016/09/03 06:47

回答ありがとうございます サンプルでは頂点のzの値を1から10000に予め決めているので 0除算を避ける処理は必要がないという事は解りましたが >初期値に0が入る可能性を想定したプログラムであれば、条件式で0を除外するなどの処理が必要でしょう zの値に0が入る場合 ( 「zバッファの範囲問題」 のところで 「zに0やマイナスの値が入る頂点は全て範囲外であり、 描画の対象外となる。 つまり、問題は起きない」 ) は z範囲変換をして zバッファの値が0から1以外の場合は xとyをzで割らないようにする処理が必要という 解釈でよろしいでしょうか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問