3Dのカメラ
papas  2016/05/11(Wed) 20:00
3Dのカメラを位置だけプログラム上で変更し、注視点はGraphics3D::FreeCamera()と同じように動かすにはどうしたらよいですか?
また、カメラと注視点を通る直線上と平面(画像)との交点を簡単に求める方法はありますか?
記事編集
Reputeless  2016/05/12(Thu) 01:37
これでいかがでしょうか。

# include <Siv3D.hpp>

void Main()
{
Graphics3D::SetAmbientLight(ColorF(0.5));

const Texture texture(Image(L"Example/Windmill.png").clip(0, 0, 320, 320), TextureDesc::For3D);

Camera camera;
camera.pos = Vec3(0, 0, 0);
double y = 0.0, rotation = 0_deg;

while (System::Update())
{
y += (Input::KeyUp.pressed - Input::KeyDown.pressed) * 0.01;

rotation += (Input::KeyLeft.pressed - Input::KeyRight.pressed) * 0.5_deg;

const Vec3 direction = Vec3(Cylindrical(1.0, rotation, y)).normalized();

camera.lookat = camera.pos + direction;

Graphics3D::SetCamera(camera);

const Ray ray(camera.pos, direction);

Sphere(camera.lookat, 0.01).draw(Palette::Yellow);

for (auto i : step(10))
{
const Plane plane = Plane(1).rollPitchYaw(90_deg - i * 36_deg, -90_deg, 0).movedBy(Cylindrical(4, i * 36_deg, i % 2));
plane.draw(texture, ray.intersects(plane) ? Palette::Red : Palette::White);
}
}
}
編集
papas  2016/05/14(Sat) 22:01
ありがとうございます。

もう一つ質問なのですが、特定の画像を貼り付けたBoxを作ることはできますか?
できれば、Boxが画像より大きくなる時は同じ画像をとなりに貼り付けるようにしたいです。
例えば、100×100の画像があって、1つの面が150×100のBoxの場合は画像を1枚と半分を貼る形にしたいです。
編集
Reputeless  2016/05/14(Sat) 22:48
Box に貼りつける画像の UV マッピングは簡単には変更できません。
実行中にサイズが変化しない場合、MeshData で UV 座標を設定するとよいでしょう。

# include <Siv3D.hpp>

void Main()
{
const Texture texture(L"Example/Windmill.png", TextureDesc::For3D);

static constexpr Float2 uv[24] =
{
{ 0.0f, 0.0f },
{ 1.0f, 0.0f },
{ 0.0f, 1.0f },
{ 1.0f, 1.0f },

{ 0.0f, 0.0f },
{ 2.0f, 0.0f }, //
{ 0.0f, 1.0f },
{ 2.0f, 1.0f }, //

{ 0.0f, 0.0f },
{ 1.0f, 0.0f },
{ 0.0f, 1.0f },
{ 1.0f, 1.0f },

{ 0.0f, 0.0f },
{ 1.0f, 0.0f },
{ 0.0f, 1.0f },
{ 1.0f, 1.0f },

{ 0.0f, 0.0f },
{ 1.0f, 0.0f },
{ 0.0f, 1.0f },
{ 1.0f, 1.0f },

{ 0.0f, 0.0f },
{ 1.0f, 0.0f },
{ 0.0f, 1.0f },
{ 1.0f, 1.0f },
};

const Mesh mesh(MeshData::Box6(8, 4, 2, uv));

while (System::Update())
{
Graphics3D::FreeCamera();

mesh.draw(texture);
}
}


Box でなく Plane を使うと楽かもしれません。

# include <Siv3D.hpp>

void Main()
{
const Texture texture(L"Example/Windmill.png", TextureDesc::For3D);

const Mesh mesh(MeshData::PlaneXY(8, 4, { 2.0, 1.0 }));

while (System::Update())
{
Graphics3D::FreeCamera();

mesh.draw(texture);
}
}


実行中にサイズが変化する場合は頂点シェーダで UV 座標をスケールすることを検討してください。
編集
件名
Re: 3Dのカメラ
名前
コメント
画像添付


投稿修正キー (投稿を修正する時に使います)
画像認証 (右画像の数字を入力) 投稿キー

- WEB PATIO -