Help us understand the problem. What is going on with this article?

THREE.JSを使った【非表示オブジェクト】との当たり判定

More than 3 years have passed since last update.

THREE.jsで当たり判定・特に「Ray(光線)を使用した当たり判定」として、いかにも「コレ使えよ!」と用意されている、

THREE.Raycaster オブジェクト、及び intersectObject メソッドがあります。

これはその名の通り「 指定位置から あるオブジェクトに対し、指定ベクトル上にある交差点を算出してくれる」という、それはまぁ3Dゲームの地形判定にうってつけのメソッドであります。

・・一見するとね。

ただ、こいつには罠が仕込んでありまして、

【非表示のオブジェクトに対しては、交差判定を行ってくれない】

という仕様になっております。

何がまずいかというと、
「地形は作りこんだモノを表示して、表示とは別に非表示のモデルを用意。その非表示オブジェクトから交差判定をする」ということが、できないんです。

単純に

 heightObject.visible = false;

//略

var ray = new THREE.Raycaster(C_pos, baseV.normalize());

// 交差判定
var objs = ray.intersectObject(heightObject);
for (var i = 0; i < objs.length; i++) {
    player1.Pos.y = objs[0].point.y;
}

としちゃうと

ukabu.png

↑こうなっちゃう

ではどうするか。

ちょっと抜け穴チックですが、下記の通りにします。

 heightObject.material.materials[0].visible = false;

tatta.png

いわば、「Object3Dでは表示対象。だけど、マテリアルで非表示対象」とすることで、上記のような「見えているものと当たり判定を別にする」ことが可能となりました。

この方法を使った時の懸念で「あれ、となると、他で【表示時と同じような、余計な計算・・・例えば、DrawMeshは走るけど、VertexShader側で透過100%とかやってない?」があったのですが、

Three.JsのRenderにて、「表示対象をリストアップ」する 【projectObject】というメソッドの中で、 material.visible がTrueでないものは、Drawリスト対象としない」という処理が行われているので、杞憂でした。

めでたしめでたし。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away