UE4の勉強記録

UE4の勉強の記録です。個人用です。

12章5節 Core/ Math API オブジェクト同士を対面するFRotationMatrixを使用した回転

<前文>

f:id:kazuhironagai77:20181028232812p:plain

今週は、FRotationMatrixの使用方法について勉強します。one object face anotherを対面と訳しましたが、正しいんでしょうか?

<本文>

<目的>

FRotationMatrixの使用方法について勉強します。教科書の説明によると、二つのオブジェクトがあって一方がもう片方を追いかけている場合、追いかけている方は常に、追っている方を向くはずです。しかしそれを実装するのは大変です。それを簡単に行ってくれるのがこのFRotationMatrixのコンストラクションメソッド(construction method)だそうです。コンストラクションメソッド(construction method)は初めて聞く言葉です。FRotationMatrixは::Make…を従えて使用するそうです。この事をコンストラクションメソッド(construction method)といっているみたいです。

<方法>

Step.0

Chapter12part1は色々いじっていたら動かなくなってしまいChapter12part2を作りました。それもこのレシピの途中で壊れてしまいました。ので今回のプロジェクト名はChapter12part3です。

Step.1

f:id:kazuhironagai77:20181028233023p:plain

のっけから訳で躓いています。Named withです。今まで見た事ないです。A is named B. で「AはBと名付けられた。」が正しい訳のはずですが、A is named with Bの場合はどうなんでしょうか?色々調べた結果、named withの場合は名前の一部を指すみたいです。のでA is named with Bとあると、Aの名前は、ABとかCBになるみたいです。1.の場合だとコンストラクターの名前はFRotationMatrix::Makeを含む名前となるみたいです。

今までの話の流れから推測すると、このレシピ内では二つのアクターが存在していて、しかもそのアクターは一方がもう片方を追いかけているみたいです。フォロワーの方は追いかけている方のアクターの事です。そのTickメソッド内でFRotationMatrix::Makeを使えとありました。

となると2つアクターを作らないといけないんでしょうか?非常にそんな気がしますがとりあえず次を見てみます。

Step.2

f:id:kazuhironagai77:20181028233154p:plain

f:id:kazuhironagai77:20181028233216p:plain

はい。まずForward facing down the +X axis, and up facing up the +Z axisの意味が分かりません。Forwardは前方です。Face downはうつ伏せです。前方を向いて更に俯いてみたら真下を指します。この真下が+のx軸になるのでしょうか?それともfacing downとうつ伏せの動作を指して前方に向かってという意味なのでしょうか?それならば真正面が+X軸になります。Forward facingで正面を向くです。それでdownですので、正面を向いて下を見ると言う意味かもしれません。こういう英語を完璧に使いこなせるとアメリカ人からもこの人英語うまいと言われるのは知っていますが、いかんせんこれ以上調べる気力が湧きません。今回のレシピで、one object face another、A is named with Bと立て続けに英語ばっかり調べています。この部分は後日調べる事にしておいて次に行きます。

やっとコードが出て来ましたが、これこのコードをフォロワーのtickに書けと書いてあります。やっぱり2つアクター作らないといけないみたいです。

作りました。

f:id:kazuhironagai77:20181028233333p:plain

いつもは、やりながらブログに書いていくのですが、今回は遊びながら色々試してみたら結果的に出来たのでそれをまとめる事にしました。のでスクリーンショットが余りないです。

Centerアクタークラスは追われる方です。Followerクラスが追う方のクラスになります。Followerクラスにはデフォルトの方向が必要です。

まずCenterアクタークラスから作成しました。

f:id:kazuhironagai77:20181028233359p:plain

Static Mesh componentのメンバー変数を一つ宣言しました。こいつにstatic meshを入れればcenterアクタークラスをUE4エディター上で表示出来るからです。ここで、UStaticMeshComponentじゃなくUStaticMeshだったらどうなのかとか、メンバー変数なんだからprivateにすべきとか遊んでいたらプロジェクトが変な挙動をするようになって結局part3まで作る羽目になってしまいました。このPart3でもクラスをpublicで作成したら何か違いが出るかとか試してみたくてpublicで作成されています。

f:id:kazuhironagai77:20181028233545p:plain

Cppファイルで初期化をしてSM_TableRoundスタテックメッシュを追加しました。今回はscene componentは入れませんでした。->SetupAttachment(RootComponent)は今回は使いませんでした。というかこれでダメだったら使うつもりだったのですが、動いたのでこのままでした。

f:id:kazuhironagai77:20181028233620p:plain

きちんとテーブルが表示されています。

イメージを見れば分かりますがFollowerクラスは椅子を追加しました。やり方は全く同じです。椅子は正面があるのでテーブルを向いているかどうかがわかります。

はい。下準備は終わりました。以下のコードをFollowerクラスのtick内に追加します。

f:id:kazuhironagai77:20181028233715p:plain

と思ったら、targetとなっています。勿論この場合Centerクラスのオブジェクトの事です。どうやってパスするのか分かりません。色々考えましたが以下の方法にしました。

f:id:kazuhironagai77:20181028233827p:plain

はい。メンバー変数で宣言して、UE4のエディター上で追加します。これが可能かどうか分かりませんがとりあえず試してます。

更に、toFollowがtoTargetにコードの途中で変わっています。どっちが正しいのか疑問だったので調べました。このサイトによると、

f:id:kazuhironagai77:20181028233854p:plain

bから   aに向かうのが引き算だそうです。(例はベクトルでレシピは位置ですが同じと考えています。)CenterからFollowerを引いているので、FollowerからCenterに向かっている事になります。toTargetが正しいみたいです。

以上の事を検討した結果、以下の結果になりました。

f:id:kazuhironagai77:20181028233933p:plain

では試してみます。

<結果>

コンパイルしました。

f:id:kazuhironagai77:20181028234028p:plain

Followerアクターを配置した後に、This CenterにCenter16をセットしました。

f:id:kazuhironagai77:20181028234047p:plain

上に示したように配置しました。

実行すると

f:id:kazuhironagai77:20181028234114p:plain

椅子がテーブルの方を向きました。成功です。

<考察>

教科書のHow it works…によると、x軸(正面)、Y軸(右)、z軸(上)に対してMakeFromXZを使用せよと書かれています。椅子を見ると、まさしくその通りにセットされています。Forward facing down the +X axis, and up facing up the +Z axisはこれを指しているのでしょう。

<まとめ>

今週はFRotationMatrixの使用方法について学びました。使い方は以下に示した通りです。

f:id:kazuhironagai77:20181028234222p:plain

<おまけ>

最近、ゲームをUE4上で作成するのに(例えブループリントで作成した場合でも)オブジェクト指向の分析が重要な事に気が付きました。なのでソフトウェアデザインパターンについて勉強しなければと思いましたが忙しさにかまけて先延ばししていましたらgame programming patternsと言う本がゲームに特化したソフトウェアデザインパターンを教えている事を知りました。まだ半分も読んでいませんが大変いい本です。