1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Lantern —レトロ3D表現のためのgame engine -- obj import

1
Posted at

Metasequoiaから取り込む

日本のポリゴンモデラーのMetasequoiaから、objをexportし、lanternでloadします。サンプルのmeka.mqoを使用しました。注意点としては、objを出力する際の拡大率の調整です。

拡大率0.1にしました。
スクリーンショット 2026-10-29 121348.png

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)
}

スクリーンショット 2026-10-29 120546.png

スクリーンショット 2026-10-29 120531.png

ねこのサンプルを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)
}

スクリーンショット 2026-10-29 120618.png

スクリーンショット 2026-10-29 120659.png

スクリーンショット 2026-10-29 120738.png

追加した部分のポイント

  1. px, py, pz, yaw の追加: 以前は lt.camera(3.0, 2.0, -4.0, ...) と固定の数字だった部分を変数に置き換えました
  2. update への移動処理: sin と cos を使って、「今カメラが向いている角度(yaw)」に向かって座標を動かしています
  3. draw でのターゲット計算: tx と tz という「1歩先の座標」を計算して lt.camera に渡すことで、そちらの方向を向くように設定しています

参考資料

1
0
5

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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?