忍者ブログ

Memeplexes

プログラミング、3DCGとその他いろいろについて

Managed DirectXとXNA

ちょっと最近更新がありませんでしたが、
ゲームを作っていました。

といっても使ったのはXNAではなくManaged DirectXです。

最初はXNAを使って作っていたのですが、
テストプレイヤーの弟達のパソコンが古いんで
動かないんですね・・・・・・。
(盲点でした。)

仕方なくManaged DirectXを使うことにしたのですが、
改めて比較するとXNAより簡単な部分が
それなりにあるように思えます。

拍手[0回]

PR

マウスが左利き設定になっているかどうかを調べるには?

XNAのMouseStateはマウスが左利きの設定になっているかどうかを考慮しません。
常に物理的なマウスのボタンの状態を保持しています。

そのため、単に「クリックしたときに弾が出る」ようにプログラムすると、左利きの人にとっては「右クリックしたときに弾が出る」ようになるのです。(完全に余談ですが、ぼくは左利きで、こういう事態に陥ったとき非常に腹が立ちます。まったくもう!)

これを避けるためには、マウスが左利き用になっているかどうかを調べる必要があります。

この方法を2つ紹介します。

拍手[0回]


極小ディスプレイ

虫型ロボットの研究で有名(?)な東京大学の下山教授のお話を聞いてきました。

で、印象に残ったのが「最小のディスプレイ」というものです。
これは、ケータイのディスプレイとかそんなのではなくて、
マイクロサイズのディスプレイです。

ものすごく小さいわけですからフツーの液晶のように
ピクセルを大量に並べて・・・と言う方法は使えません。

ではどうやって画像を表示しているのかと言うと、
これはテレビのブラウン管の表示に似ています。

まず、赤、緑、青の3原色のライトをそれぞれ1つずつ用意します。
(このライトはそれほど小さくなくてもかまいません。
もちろんある程度は小さくなくてはならないのですが)

そしてその上に物すごく小さな穴の開いたをかぶせ、
そしてその板は電気の力で精密に動かせるようにします。
(x軸方向とy軸方向ですね)

そうすると、上から見ると小さな点が光っているように見えるでしょう。
(そしてその点の色は下のライトによって自由自在に変えられます!)

さて、この点の位置は、板を動かすことによって変えることができますね。
ちょうどブラウン管が電子ビームを好きなところに当てることが出来るように、
この最小ディスプレイも板(の穴)を好きなところに移動させることが出来るのです。

あとはもうブラウン管と同じです。

光の点を、色を変えながら、横に動かします。
すると点が線に見えます。
人間の目は残像によって、少しの時間なら光が残ってしまうんですね。

これを、縦方向に少しずつずらしながら繰り返します。
すると線が面になります。

こうして、単なる光の点の移動が画面として見えるわけです!!

なるほど確かにこの方法でうまく小さなディスプレイを作ることが出来ます。
実際、文字を表示しているところの画像を見せてもらいました。

しかし、これが一体なんの役に立つのでしょうか
このディスプレイを大量に並べて超高解像度の大きなディスプレイを作るにしても、
板を動かさなければならないわけですから、
動かす部分が邪魔になって並べることは出来ないはずです。

その点を下山教授に聞いてみると、
「いや~、なんに使えるんでしょう?わかりませんね。思いついたら教えてください(笑)」
本人にもわからないそうで、こういう技術の使い道と言うものは
将来になってみないとわからないのだそうです。

うーん、まぁ、がんばってください!

拍手[0回]


かんたんXNA 間違い修正

かんたんXNAを見直していたらいくつか間違いを見つけたので
直しておきました。
(これでどつぼにはまった方にはすいません)

まず、
誤: content.Load(...
正: content.Load<Texture2D>(...
です。

コードの時点では合っていたのですが、
ブログの記事にするときに
<Texture2D>

<texture2d></texture2d>
になってしまいました。
タグであると解釈されてしまったんですね。

同様に
誤: drawUserPrimitives(...
正: drawUserPrimitives<....>(...
です。

こういう間違いがあるから
書いた記事は後から何度か見直ししなければいけませんね。

拍手[0回]


Java 列挙型

久々にJavaを使っていると(JOGL)、
列挙型の使い方がわからなくなったので
今後のためメモしておきます。

まず文脈を話しておくと、
Java用のOpenGL(JOGL)を使っていたのですが、
この定数が汚いんですね。

多くの定数がGLというクラスの中に定義されていて、
しかもその定数の種類というのが、
プリミティブのタイプもカリングモードも
行列の種類もアルファブレンディングも
なにもかもごっちゃになっています。

//プリミティブのタイプを表す定数
GL.GL_POINTS
GL.GL_LINES
GL.GL_LINE_STRIP
GL.GL_LINE_LOOP
GL.GL_TRIANGLES
GL.GL_TRIANGLE_FAN
...
//行列
GL.GL_PROJECTION
GL.GL_MODELVIEW

...(以下略)


ごちゃごちゃです。
まず第一、"GL"をなぜ2度も書かなければならないのか
そこが不条理です。

そして第二に、目的の異なる定数を1つのクラスに
大量に詰め込むのはよくありません。
どのくらい大量かというと、このくらいです。
もうわけがわかりません。

こんなときには列挙型を使って用途別に分別すべきです。
(そしてGLクラス全体のラッパーを作り始めたのですが、
ここではあまり関係ありません)

とりあえず最初は描画する図形のタイプを
表す定数を列挙型にすることにしました。

しくじってしまったのはここで、
C#のようなやり方をしてはいけません

Compile Error!

import javax.media.opengl.*;

public enum PrimitiveType {
	Points = GL.GL_POINTS,
	Lines = GL.GL_LINES,
	LineStrip = GL.GL_LINE_STRIP,
	LineLoop = GL.GL_LINE_LOOP,
	Triangles = GL.GL_TRIANGLES,
	TriangleFan = GL.GL_TRIANGLE_FAN,
	Quads = GL.GL_QUADS,
	QuadStrip = GL.GL_QUAD_STRIP,
	Polygon = GL.GL_POLYGON
}

正しくはこうです。
(javaのコードとして記法に問題がありますが、
まあほうっておきましょう(PointsではなくPOINTS))

import javax.media.opengl.*;

public enum PrimitiveType {
	Points(GL.GL_POINTS),
	Lines(GL.GL_LINES),
	LineStrip(GL.GL_LINE_STRIP),
	LineLoop(GL.GL_LINE_LOOP),
	Triangles(GL.GL_TRIANGLES),
	TriangleFan(GL.GL_TRIANGLE_FAN),
	Quads(GL.GL_QUADS),
	QuadStrip(GL.GL_QUAD_STRIP),
	Polygon(GL.GL_POLYGON);
	
	private int value;
	
	PrimitiveType(int value){
		this.value = value;
	}
	
	public int value(){
		return value;
	}
}

Javaでは = ではなく () を使うんですね・・・
知りませんでした。
そしてその値がコンストラクタの引数となるようです。
その値をわざわざ保存して、ゲッターで手に
入れられるようにしなければなりません。

そして、さらにC#と違う点として、値を複数指定することも出来ます。
例えば、サンの解説によると、太陽系の各惑星の列挙型を作ったとすれば、
質量と半径の両方を列挙型の値とすることができます。

このことから、Javaの列挙型はC#のものよりも柔軟であるといえるでしょう。
それがいいほうに向かうか悪い方に向かうかはわかりませんが。


拍手[0回]


        
  • 1
  • 2
  • 3