先日は、



にて、文字列をそのまま配置すると問題がある時に文字数を増やしてフィルタリングする方法について書きました。

 この様な処理も暗号の一種になりますが、アスキーコードの場合だと少ない範囲でランダムで文字を追加できる為先日のような処理を実装することが出来ます。

 文字列のコントロールをする場合、加工する文字列と復元する文字列の存在がありますが、この双方を手作業で行うと大変なので、こうした文字列を作る際には、コードを書いて処理をすることになります。

 先日も書きましたが、暗号のような構造を作る場合には処理をするためのアルゴリズムが存在するので、そのアルゴリズムをどういった形で作るのか?を最初に考えることになります。この辺りは、プログラミング言語を使ってアプリケーションを作る際にはごく当たり前に行う作業になりますが、この文字列の加工の処理については、

  ■ 変換
  ■ 解読

の処理が発生します。つまり、暗号を作るアプリケーションを構築する際には、この2つを作る必要があるわけです。文字列の変更については、

  ■ 元の文字列
  ■ 暗号化した文字列
 
の相互変換が必要ですら、暗号化した処理を実装した場合、その逆の工程で解読していくことになります。

 こうした文字列ですが、ゲーム内で使用する場合には見得ては困るものも存在するので、そうした場合には、何かしらの方法で文字列の認識が出来ないようにしておく必要があります。そうした場合に、コードを開くだけのエディタでわからないようにするだけだとテキスト部分をバイナリファイル参照にすればいいのですが、そのバイナリをバイナリエディタで見た時に内容が解るようだと問題があるので、何かしらの読み方の仕組みを作ったほうがいい場合もあります。

 プログラミング言語を使用した際のテキストの自由度が高いのは、文字列が 【 文字配列 】 と言う 【 配列 】 で構成されているためですが、この構造については、C言語では標準仕様になっています。なので、char型では、1文字歯科対応していないので、char a=[] のような感じで、配列を指定して初期化することになります。この配列に対して、変数を呼び出してそこにリテラル(変数の値)を代入する様な記述をすることで、文字列を扱えるようになっていますが、この処理を行うと、配列内の複数のデータを管理するのと全く同じ処理になるので、自由度の高い編集が出来るようになります。
 

 

  配列

 

 配列については、Array(アレイ)と言いますが、この機能はどのプログラミング言語でも使用できるようになっています。ECMA Script(JavaScript)でもArrayは実装されているので、多次元配列を使うことが出来ますし、Pythonだと 【 リスト 】 がコレに該当します。

 これは、一つの変数で多くのデータを格納して管理するための物になりますが、 【 集合 】 を扱う為の機能になります。変数の場合、

  a=1
  b=1
  C=1

のように 【 変数名と値が1対1で紐付けされる 】 仕様になっていますが、配列の場合だと、

  a=[1, 2, 3, 4, 5, 6, 7]

のように複数の値を格納することが出来ます。その為、この集合に対して

  ■ 奇数
  ■ 偶数
  ■ 素数
  ■ 2の倍数
  ■ 3の倍数

の様なフィルターを掛けると、用意した数値の中から条件に見合った値を抽出することが出来ます。この判定を記号を使って氷原することで、複数のフィルターによって条件抽出をする方法が 【 集合演算 】 になります。

 集合については、高校の数学Aの 【 集合と論理 】 で取り扱いますが、データの集合を用意した際には個別のデータには特徴があるわけですが、共通した特徴を持ったものも存在しています。この場合、同じカテゴリーに分けることが出来るのでカテゴライズすることでそのグループとして認識して扱うことが出来るわけです。

 この事例だと、 【 数値の仕様 】 になっていますが、

  ■ 偶数で2の倍数
  ■ 偶数で3の倍数

のようなものも存在します。この判定が二値の判定結果だと論理演算なので論理積を使いますが、集合演算なので積集合を使うことでこの2つの条件を示すことが出来ますから、

  ■ 偶数 ∩ 2の倍数
  ■ 偶数 ∩ 3の倍数

のように示すことが出来るわけです。この時の処理を人が行う場合、データ検索とパターンでの判定を行っていると思いますが、行っている内容はインターネット上の検索エンジンやOSに実装された検索窓をしようしたデータ検索と同じです。

 数学Bの集合と論理ですが、

  ■ 集合 : 集まりから条件抽出を行う
  ■ 論理 : 確定した日の結果の組み合わせによる判定の構築 

になりますから、前者は、検索で使用しますが、後者はプログラミング言語だと条件分岐のifと組み合わせて使用するものになります。集合演算の場合、Aと言うグループとBと言うグループの判定で行うことも出来るので、

  a=[1, 2, 3, 4, 5, 6, 7]
  b=[2, 3, 5, 8, 9, 10]

のような2つの集合がある場合に、集合で判定をすることが出来ます。例えば、論理積と同じように共通部分を抽出する積集合の場合だと

  a ∩ b

のようになりますが、この場合だと、aとbで共通している値がそのグループに該当するので、

  【 2, 3, 5 】

が判定結果になります。インターネットの検索エンジンの場合、膨大な数のデータがサーバ内に存在するので、その情報の検索をする際にキーワード検索を行うことになります。その処理によって 【 集合演算の条件 】 を用意しているわけですが、その集合演算の処理として実装するフィルターを記述によって絞り込んでいくことで、目的にあった条件のものだけを抽出することが出来るようになっています。

 高校の数学の選択科目では、

  ■ 数学A : 集合と論理
  ■ 数学B : 平面と空間のベクトル

を学習できますが、普通科の高校の数学では、プログラミングで使用するものもふくす登場しますが、グラフィックやゲームで使用できそうなものも結構登場します。ちなみに、この選択科目の内容ですが、

  ■ 集  合 : データの管理の基本
  ■ 論  理 : コンピューターの構造の基礎とビット演算など

  ■ ベクトル : ベクターグラフィックの座標の基本

なので、数学Aでは配列のデータ抽出と二値論理の基本を学ぶので、コンピューターの動く仕組みで使用する判定方法を学習することになります。プログラミング言語でも0bxxxxでに進数を使えるので、多ビットのデータに対して論理演算を適応できるのですが、この時の判定が論理で学ぶ内容担います。

 ベクトルは、ベクターグラフィックの基本ですから、3DCGのポリラインやバーテックスの基本は幾何ベクトルです。これに、ポリゴンと表層のサーフェスが必要になりま菅、ポリゴンは、頂点で作成された面の表面の方向を指定した状態でその面に対して処理をする仕様になっていますが、この時の表層であるサーフェスを指定する時に使用するのが、数学で登場する 【 法線 】 になります。また、この法線方向の面がカメラオブジェクトで見て確認できるものになりますが、ジオメトリ(ポリゴンメッシュ)を作った際の外側の部分が見えている場所になります。つまり、内側と外側の判定をする必要がるわけですが、この時に使用されているのが 【 内積 】 と 【 外積 】 になります。高校の数学では座標平面でこの法線と外積も学習しますが、グラフィックで扱う処理のいくつかは普通科の高校のカリキュラムで学習します。

 現在は、情報Iのカリキュラムも一般科目として扱われていますが、この中で

  ■ R言語
  ■ matplotlib(Pythonの外部ライブラリ)

を使用する機械もあるかもしれませんが、この時にデータと帳票を使ったり、データを加工する処理がありかもしれませんが、この時に使用している多次元データも集合なので、この中のデータ抽出の処理が集合演算の考え方になります。
 

 

 

  配列の利用方法

 
 コンピューターを使うとデータ管理をすることになりますが、この時に扱うのは変数で格納できるものになります。基本的に、これは文字の形で行われているのですが、コンピューターの仕組みを知らない場合、 【 マルチメディアファイル 】 のようなものとこうした処理が全く関係ないもののように感じるかもしれません。ただし、この考え自体が 【 データをカテゴリー別に集合演算で分けた時の判定結果 】 でしかないので、データ管理の方法とは少し違うものになります。


 ファイルには、 

  ■ データ  : 文字だけで出来ているもの
  ■ バイナリ : 文字以外も含まれるもの

が存在するわけですが、1つのファイルで完結しているマルチメディアフィルの場合は後者に該当します。コレをデータベースで扱う場合には、バイナリ形式のファイルを扱うので先程の認識であっているのですが、 【 ファイル生成 】 となると話が変わってきます。つまり、完成したファイルをデータとして管理する状態と、ファイル其の物を制作する作業では処理其の物が異なるので、後者の場合だとバイナリは読み込みで使用しますが、処理をする場合にはデータとして扱います。

 その為、処理を行う際にはデータを扱った処理の方法が必要になるので、文字で書かれたデータの管理や処理が必要になります。その為、多次元配列を使う事になるわけですが、3DCGの場合だと、タプルで格納した3次元の座標データでバーテックスの座標を指定することでポリゴンの基本となる座標の位置を指定できるのですが、こうしたデータも各座標データの集合になります。

 ベクターグラフィックはレンダリングをするので基本的にはテキストで出来ているので、SVGのように手書きで作れるものもありますし、レンダーの指定は基本的にはテキストで行えるようになっているので、Pov-Rayのように全て手書きでオブジェクトやライトやシェーダーの指定まで行ってレンダリングできるものもあります。

 このようにベクターグラフィックは 【 テキストで構成されたデータ 】 になりますが、マルチメディアファイルの場合、バイナリで書き出しが行われているものになりますから、生成段階ではテキストで指定をしますが、書き出す段階だとそのデータをバイナリにして出力することになります。

 この時に、画像も音声も座標制御をするので、数値の羅列を使う事になります。

 

 

  動画と画像

 

 動画ファイルは、圧縮をかけない場合だと、All-IntraやCinema DNGに見られるような全てが画像で生成されているものになりますが、MPEG圧縮のように予測をしてフレームを生成する様な仕組みのものもあります。この場合、Iフレームだけが画像で、PフレームとBフレームと言う画像ではない予測フレームなどによって像を生成する仕組みになっています。画像で考えた場合、前後のフレームと現在のフレームを見た場合、その違いは、 【 差 】 になります。つまり、この部分だけを更新すれば、全てのピクセルの色のデータを変更せずに済みます。この場合、全てが画像で生成されている映像を解析して、その映像から差を見つけて処理をすればいいのですが、こうした圧縮のかかっているロッシー形式(不可逆圧縮)の物も存在します。このMEPG圧縮は配信やコンシューマのカメラで使用されるような汎用コーディックになりますが、基本的には画像の集まりですから、画像ファイルと同じ構造になっています。

 写真や画像ファイルは、ラスターグラフィックなので、ピクセルの集合ですから、二次元配列で発光体が敷き詰められたオーロラビジョンのような構造の物をデータで管理していることになります。ラスターグラフィックについては、

 

 

 

 

 

の中で触れていますが、基本的に、正方形のピクセルの集合なので、

 ■ データの有無
 ■ 色のデータ(RGB)
 ■ マスクのデータ(二値)

などを指定して処理をすることになります。この場合、多次元配列になりますから、集合を扱うことになりますが、それぞれのデータに色の情報を指定することになるので、RGBのそれぞれの色成分の階調のデータを00〜FF(もしくは0〜255)で指定することになります。これを各ピクセルの縦横の座標で指定することになりますから、基本的にはデータの管理を行うことになります。

 プログラミング言語を使って画像を作る場合、コードでも画像を作ることが出来ますが、画像ファイルで出力する際には二次元配列にデータを格納することになりますから、画像を構成する数値のデータの利用が必要になるわけです。

 集合演算については、画像処理における範囲選択になりますが、この際のデータの指定も数値の推移でコントロールできるので、整数座標のした状態で数tの指定をすれば特殊な形のしていもできるようになるので、データの範囲を指定して処理をすることが出来ます。

 このように帳票のような二次元配列に対してデータの範囲選択やデータの部分的な変更を行う処理は、事務処理のように見えるかもしれませんが、これは、【 内部処理 】 ですから、そのデータが何を制御するものなのかで結果も変わってきます。

 

 

  音の場合

 

 音については、自然界の音はサインカーブになりますが、この波形は中学校の理科で見ることになります。この時に

 ■ 波の高さ : 音の大きさ(実際には音圧)
 ■ 波の間隔 : 音の高さ

に関係していることを学習しますが、この波の形は三角関数の f(x)=sin(x) で作ることが出来ます。この形医すると合成関数に出来ますが、和音を作る場合には特定の周波数の音を重ねるので、この構造のものを重ねていくことになります。この時に周波数を上げると音が変わるので、異なる関数同士を加算することで和音にすることができるわけです。現実世界の音は和音で構成されているので、その和音の高清要素がどういった波形なのかで音の状態が変わるわけですが、オシロスコープから取得できる音もオーディオファイルで書き出しが出来るので、バイナリ形式のものにすることが出来ます。

 この波形も波のデータを構成する数値の変化が存在するわけですから、この状態を構成する数値のデータが存在します。と言っても、音の場合は数式で示すことが出来るので、数式と変化で状態を作ることになりますが、このデータをサンプリングした値の集合で示すことも出来ます。その為、音のデータも処理をする際には数式で管理したほうが扱いやすいのですが、構造的にはデータの集合という形になっています。

 音については、

 

 

 

の中で触れていますが、三角関数のグラフを使うことで音は作れるので、その状態をどう変えていくのかを波形の変化を構成する数式で調整することになります。


 三角関数は高校の数学IIで登場しますが、音には 【 周波数成分 】 があり、その組み合わせで音が構成されています。なので、EQを使うことでこの周波数成分の音圧を変更して状態を変更することが出来るのですが、この処理をする場合には、 【 波形を構成する関数を個別の周波数単位で分離させる 】 処理が必要になります。この処理は高校ではなく、大学で学ぶ 【 フーリエ級数 】 を使った 【 フーリエ変換 】 によって行うことが出来ます。EQによる変化は、




になりますが、音圧だけでなくパンポットで音の位置を変更できるのでステレオ音源の場合だと左右と奥行きの位置関係の指定が出来るようになっています。


 音に関しては、高校の物理のカリキュラムで 【 波動 】 が登場しますが、この時に波の干渉で

 ■ 同じ波 : 波が高くなる
 ■ 逆の波 : 波が打ち消し合う

ことを学びます。波の状態ですが、逆の位相場合だと波がなくなるのでNRヘッドフォンを使ったように音がしなくなります。コレに対し、同じ位相野並をぶつけると波動と全く同じように音圧が上がるので音が大きく聞こえます。これについては、


の動画内でも行っていますが、同じ波形が鑑賞すると音圧が上がるので、元の音が適正な音圧の場合だと音が割れます。

 

 また、この特性は音の変質も発生するので、トラック内の音圧を振り切らせると、

 

のように歪み系のフィルターを適応したような状態になリます。音については、

 

 

 

の中で触れているように、いろいろな処理が出来ますが、作る際にはデータを扱うので数式や多次元配列を使う事になります。
 

 

  ゲームと配列

 

 ゲームでは、スプライト処理を使用する場合がありますが、3DCGを使ったゲームでもUI部分は3D出ない場合があります。例えば、インベントリを開いた際のアイテムはポリゴンではなくラスターグラフィックで描かれている画像が使用されている場合がありますが、インベントリのスロットも位置を指定した二次元配列ですから、レイアウトを指定してある状態になっていますが、そういった構造の集合の管理方法が用いられています。

 ゲームの場合、リフレッシュレートがあるので、秒間に数十回の画面の更新が必要になるわけですが、コレだけの処理を行おうと思うと読み込みによる負荷が少ないほうがいいので、画像も最初に読み込んでその後に使用できる状態にします。この時にVRAMに画像をストックすることになりますが、画像の解像度や枚数が増えるとVRAMとメモリー消費量が肥大化するので、アトラス化して枚数を少なくして管理をすることになります。これは3DCGを使ったゲームでローレゾにする場合も同じ考え方になりますが、スプライトのみで動くゲームを作る場合も同じ考え方になります。

 スプライトでの処理はタイルを使った管理を行いますが、この時にゲーム内で使用する背景やオブジェクトについてはカテゴライズしてタイルで管理をすることになります。この時にキャラクターは進行方向文分だけのアニメーションを作る必要があるので、ドット絵を打つ必要が出てくるわけですが、マップの場合定数なので、指定したシーン内で使用するタイルを読み込んで使用することで、同じサイズの画像で異なるマップを再現できます。

 一つの画像に全てのマップで使用するタイルを配置できないわけではありませんが、巨大な画像は重たいので異常な高解像度の画像になりそうな場合だと、小分けにした画像を用意してタイルを事前に先読みしてから使用することになります。

 この時のタイルは設計段階で指定した解像度を使用することになりますが、考え方としてはラスターグラフィックのピクセルの位置の指定にタイルサイズを係数を追加して制御する感じになりますから、扱っているものは画像ですが、処理の方法は、二次元配列の数値のデータを扱うのと同じ状態になります。

 タイルの管理については、

 

 

 

 

の中で触れていますが、考え方は3D担っても同じなので、地面の位置情報をタイルと同じように制御をする場合には配置するものの場所を配列で指定することが出来ます。

 ゲームのマップを作る場合、タイルを敷き詰めることになりますが、この時に 【 特定の位置に特定のタイルを配置する 】 わけですが、このルールは別のゲームでも存在しているので、全く同じ管理方法を適応できます。例えば、

  ■ 将棋
  ■ チェス

では、初期化をした際にコマの位置が決まっていますが、コレも配列で盤面を作って、その盤面の状態を操作や解析をした後の思考ルーチンの処理によって状態変化を入れることになります。なので、この場合、盤面がゲームのレベルデザインで作ったマップと同じ状態で、コマはプレイヤーキャラやMOBと同じ考え方になります。

 オセロゲームもターン制のゲームになりますが、こうしたゲームの延長線上にあるのがタワーディフェンス系のゲームになります。 

 ゲームを作る際に文字情報をテキストで制御するのではなく、タイルで制御する場合もありますが、この場合、等幅フォントでタイルを作ってその呼び出しで数値の変化を入れることになります。例えば、スコアの場合だと、0〜9までの番号のタイルを用意しておいて、スコアの数値と移動距離を連動させると、表示をする際に呼び出す範囲が変化するので、スコア表示をする際にテキストをオーバーレイするのではなく、アプリケーション内で指定したタイルを格納するレイヤーの階層の違いを使った処理を子なうことが出来ます。また、レイヤーを設けない場合だと、レイアウトで固定をしてその場所に数値のタイルを表示することになりますが、この場合も、タイルのサイズの調整と表示方法を考える必要がでてきます。

 これが実装したひらがななどを読み込んで使う場合だと、五十音順にタイツを作って文字で制御をすると解読できてしまうので、数値側や読み込む文字を実装したタイルの配列に工夫をするとコードを見るだけで文章が解ってしまう状態を回避することが出来ます。