Metasequoiaから取り込む
日本のポリゴンモデラーのMetasequoiaから、objをexportし、lanternでloadします。サンプルのmeka.mqoを使用しました。注意点としては、objを出力する際の拡大率の調整です。
objファイルを開いてみると,5から65と数値があります。Lanternの画面に収まるには、最小の数値を0.5くらいを目安にして、拡大率を調整すると良いでしょう。0.000005だと画面にも出てきません。
# Created by Metasequoia
mtllib meka.mtl
v -5.387770 65.521507 0.584470
v 5.387770 65.521507 0.584470
v -5.387770 64.777161 8.243080
コードmain.wick
// ==========================================
// 1. トップレベル: モデルと画像の読み込み
// ==========================================
// 1. OBJモデル(立体のデータとUV座標)を読み込む
let m_player = lt.load_mesh("meka.obj")
let mountains = lt.load_mesh("mountains2.obj")
// 2. BMP画像(テクスチャ)を読み込む
let tex_player = lt.load_texture("00tex_master.BMP")
let time = 0.0
fn update(dt: num) {
time = time + dt
}
fn draw() {
lt.clear(0.1, 0.1, 0.15)
// カメラの設定 (少し離れた斜め上から原点を見下ろす)
lt.camera(3.0, 2.0, -4.0, 0, 0, 0)
// ライトの設定 (テクスチャの色を綺麗に出すため、少し明るめに)
lt.light(0.5, -1.0, -0.5, 0.6)
// ==========================================
// 3. テクスチャ付きモデルの描画
// ==========================================
// ※エンジンによってテクスチャ適用の関数名が異なる場合があります。
// (例: lt.draw_tex, lt.draw_mesh, あるいは事前に lt.bind_texture を呼ぶなど)
// ここではテクスチャ画像(tex_player)を直接渡して描画する一般的な想定で記述します。
// lt.draw(メッシュ, X, Y, Z, 回転X, Y, Z, スケールX, Y, Z, R,G,B, テクスチャ)
lt.draw(
m_player,
0, -2, 0, // 座標 (原点)
0, time * 1.3, 0, // Y軸を中心に回転させる
0.6, 0.6, 0.6, // 1倍の大きさ
1,1,1,
tex_player
)
lt.draw(mountains, 0, -2.0, 0, 0, 0, 0, 600, 100, 600, 0.42, 0.40, 0.52)
lt.print("Textured OBJ Model", 10, 10, 1, 1, 1, 1)
}
ねこのサンプルを3Dウォークスルー
矢印キーで広大な山脈(mountains)や、クルクル回る猫(cat)の周りを自由に歩き回れるようになります。
ウォークスルー対応版コード
// ==========================================
// 1. トップレベル: モデルと画像の読み込み
// ==========================================
let pi = 3.14159265
// OBJモデルとテクスチャの読み込み
let m_player = lt.load_mesh("cat.obj")
let mountains = lt.load_mesh("mountains2.obj")
let tex_player = lt.load_texture("00tex_master.BMP")
// カメラ(プレイヤー)の座標と角度を追加
let px = 0.0
let py = 2.0 // 猫を見下ろせるくらいの高さ
let pz = -5.0 // 猫より少し手前
let yaw = pi / 2.0 // 最初は奥(Zのプラス方向)を向く
let time = 0.0
fn update(dt: num) {
time = time + dt
// ==========================================
// カメラの移動・回転ロジック
// ==========================================
let turn_speed = 2.0
let move_speed = 5.0
// 左右キーで視点を回転(yaw角度の増減)
if lt.key("left") { yaw = yaw - turn_speed * dt }
if lt.key("right") { yaw = yaw + turn_speed * dt }
// いま向いている方向のXとZのベクトルを計算
let dir_x = cos(yaw)
let dir_z = sin(yaw)
// 上下キーで向いている方向へ前進・後退
if lt.key("up") {
px = px + dir_x * move_speed * dt
pz = pz + dir_z * move_speed * dt
}
if lt.key("down") {
px = px - dir_x * move_speed * dt
pz = pz - dir_z * move_speed * dt
}
}
fn draw() {
lt.clear(0.1, 0.1, 0.15)
// ==========================================
// カメラの設定 (計算した px, py, pz を使う)
// ==========================================
// 見つめる先の座標(ターゲット)を計算
let tx = px + cos(yaw)
let tz = pz + sin(yaw)
// lt.camera(自分の位置X, Y, Z, 見つめる先X, Y, Z)
lt.camera(px, py, pz, tx, py, tz)
// ライトの設定
lt.light(0.5, -1.0, -0.5, 0.6)
// ==========================================
// テクスチャ付きモデルの描画
// ==========================================
// 猫の描画
lt.draw(
m_player,
0, 0, 0, // 座標 (原点)
0, time * 1.3, 0, // Y軸を中心に回転させる
0.07, 0.07, 0.07, // スケール
1, 1, 1,
tex_player
)
// 山の描画
lt.draw(mountains, 0, -2.0, 0, 0, 0, 0, 600, 100, 600, 0.42, 0.40, 0.52)
// 操作説明などを表示
lt.print("Textured OBJ Model - Walkthrough", 10, 10, 1, 1, 1, 1)
lt.print("UP/DOWN : Move", 10, 25, 0.8, 0.8, 0.8, 1)
lt.print("LEFT/RIGHT : Turn", 10, 40, 0.8, 0.8, 0.8, 1)
}
追加した部分のポイント
-
px,py,pz,yawの追加: 以前はlt.camera(3.0, 2.0, -4.0, ...)と固定の数字だった部分を変数に置き換えました -
updateへの移動処理:sinとcosを使って、「今カメラが向いている角度(yaw)」に向かって座標を動かしています -
drawでのターゲット計算:txとtzという「1歩先の座標」を計算してlt.cameraに渡すことで、そちらの方向を向くように設定しています
参考資料





