3Dのカメラ
papas 2016/05/11(Wed) 20:00
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
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 座標をスケールすることを検討してください。