LoginSignup
5
2

More than 1 year has passed since last update.

はじプロ画面分割部のすすめ② 実装編

Last updated at Posted at 2022-03-09

の続き

※この記事において [hoge] という記述は、ノードン名を指す。
 ex) [位置を角度に] は、位置を角度にノードン のこと

3. 実装

はじプロにおいて、ノードンによって角度の基準が異なることに注意をする必要がある。
[位置を角度に],[角度を位置に]:3時方向が 0° で、反時計回りに増えていく(0時方向が 90°)
[角度センサー],各種モノノードン:6時方向が 0° で、時計回りに増えていく(9時方向が 90°)

3.1. 画面オフセット

左右分割の場合

2022030323150400-1DC473CEFCA17AB42EE8681FFF996D70.jpg

先に紹介した左右に分割した画面だが、それぞれの画面基準でキャラクターが正面を向いていない。
正面に向けるためには、角度や座標にオフセットを与える必要がある。
↓左画面だけオフセットするとこうなる。

2022030323311000-1DC473CEFCA17AB42EE8681FFF996D70.jpg

与える角度(λ)は以下のように、カメラと自機を結んだ線の傾き(θ)から求められる。
image.png

ΔX = 自機の X座標 - カメラの X座標
ΔZ = 自機の Z座標 - カメラの Z座標
θ = arctan(ΔX/ΔZ)  ⇒ [位置を角度に] の横位置に ΔZ、縦位置に ΔX を入力することで計算できる
λ = 180 - θ

上下分割の場合

オフセット前
2022030416540400-1DC473CEFCA17AB42EE8681FFF996D70.jpg
オフセット後
2022030416590300-1DC473CEFCA17AB42EE8681FFF996D70.jpg

①上下分割の場合は、下準備として "カメラの座標(距離)" と "上画面の床の高さ" を決めておく。
カメラについては、画角を狭めにし、距離を遠くすると良い。
床の高さについては、カメラを決めたのち実際のゲーム画面で中央に来るように調整する。

②その後、下画面をカメラを中心とした円運動をさせ上画面のオフセット(d,λ) を求めていく。
image.png

③ カメラと下画面の床の距離と見た目の角度を求める。
image.png

ΔY = カメラのY座標 - 床のY座標
ΔZ = | カメラのZ座標 - 床手前のZ座標 |
r = √(ΔY^2+ΔZ^2)  ⇒ [ルート] に ΔY^2+ΔZ^2 を入力することで計算できる
θ = arctan(ΔY/ΔZ)  ⇒ [位置を角度に] の横位置に ΔZ、縦位置に ΔY を入力することで計算できる

④ ③で求めた値から d と λ を求める。
image.png

ΔY' = カメラのY座標 - h
ΔZ' = √(r^2-ΔY'^2) ⇒ [ルート] に r^2-ΔY'^2 を入力することで計算できる
φ = arctan(ΔY'/ΔZ')  ⇒ [位置を角度に] の横位置に ΔZ'、縦位置に ΔY' を入力することで計算できる

d = ΔZ' - ΔZ
λ = θ - φ

先のオフセット後を横から見るとこんな感じになっている。
2022030417045500-1DC473CEFCA17AB42EE8681FFF996D70.jpg

以降は、「上下分割」&「完全分離方式」を対象に記載する。

3.2. 座標計算

  • 画面分割では、以下のような操作部のモノの位置関係を
image.png

 以下のように自機を中心とした位置関係に置き換える必要がある。
image.png

  • 最終的に求めたい値、自機からの距離(X,Z)と、モノの向き θ を、操作部の情報から求める必要がある。
image.png
  • X,Z については直接求めることができないため、距離 r と自機から見たモノの方向 λ を求める。
    r と λ が求まれば、X,Zは以下で求めることができる。
X = r * cosλ  ⇒ cos は [角度を位置に] の横位置出力
Z = r * sinλ  ⇒ sin は [角度を位置に] の縦位置出力
image.png
  • r と λ は、操作部の情報から求めることができる。
ΔX = モノの X座標 - 自機の X座標
ΔZ = モノの Z座標 - 自機の Z座標
r = √(ΔX^2+ΔZ^2)  ⇒ [ルート] に ΔX^2+ΔZ^2 を入力することで計算できる
α = arctan(ΔZ/ΔX)  ⇒ [位置を角度に] の横位置に ΔX、縦位置に ΔZ を入力することで計算できる
β = 自機の Y角度
λ = α + β - 180
image.png
  • モノの向き θ については、操作部のそれぞれの向きから求める。
image.png
  • 以下の式で求められる。
β = 自機の Y角度
γ = モノの Y角度
θ = γ + (180 - β)
image.png
  • 上記の流れをノードンガレージで組むと以下のようになる。
    (わかりやすさ重視のため、いくつか無駄ノードンはあります)
2022030817362100-1DC473CEFCA17AB42EE8681FFF996D70.jpg

3.3. モノ移動

各画面のモノについて、3.2. で求めた座標、角度に移動させる。
一つ注意として、各画面の自機と同じ座標に始点となるモノを Y軸回転 0°で配置する必要がある。(自機は 180°で配置されておりこれを始点とすると、180°反対の位置にモノが移動してしまうため)
配置したモノを始点とし[フリースライド連結]と[Yヒンジ連結]でモノを連結すればよい。

  • ノードンガレージで組むと以下のようになる(オフセット等はしていない)。わかりにくいが、右下の自機と書いてあるところに、自機となる [けだまる] と始点となる [球] が重なっている。
    下画面と書いているが、上画面も始点となる自機が変わるだけで同様である。
2022030920150800-1DC473CEFCA17AB42EE8681FFF996D70.jpg

3.4. はみ出し対策

下画面と上画面が独立しているわけではないので、概要編で説明したように、そのままではモノがはみ出してもう一方の画面に干渉してしまう。そのため以下のようなはみ出し対策を行う必要がある。

①実際にはモノを動かすアニメーションで動いているように見せる
②透明テクスチャの On/Off で、特定エリアからはみ出したら透明にする
③のばせるモノを利用して、特定エリアからはみ出さないようにリアルタイムに長さを変える

①の方法
シンプルなモノにテクスチャーを連結してアニメーションさせるだけなので、割愛。

②の方法

  • 以下のように、画面描画部でモノが自機(青いライン)より手前に来た場合に、モノを透明にすればよい。
    具体的には、Z が 0より小さくなったら、透明テクスチャを On にする。
image.png
  • ノードンガレージで組むと以下のようになる。
2022030920140100-1DC473CEFCA17AB42EE8681FFF996D70.jpg

③の方法

  • まず、壁の始点となるものを、3.2. 3.3. の方法で計算し移動する。
  • 壁の長さは、壁始点の移動に利用した Z および θ から算出することができる。
image.png
W1 = Z / cosθ
W2 = Z / sinθ
  • これだけだと、Z がマイナスの時にも壁が描画されることになってしまうので、Z >= 0 の出力をかけることで対応する。ノードンガレージで組むと以下のようになる。
2022030920124500-1DC473CEFCA17AB42EE8681FFF996D70.jpg

3.5. 実装編まとめ

3.1.~3.4. であげた手法を用いて複数のモノを描画することで、画面分割を実装することができる。
さぁみんな、画面分割部へ入部しよう。そして、先のファイナルラップのようなレースゲームの表現方法を考えよう。

※画面分割はゲームを表現するための一手法にすぎず、作成しようとしているゲームの内容そのもののほうが大事であることは言うまでもない。

--
ワークショップ編に続く

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2