graphics3d::ToScreen()について
ヴート 2022/11/13(Sun) 08:51
擬似3D を作るにあたり3D 座標をスクリーン座標に変換する方法を探してて下記のページを見つけました。
https://qiita.com/Reputeless/items/a7d4465ad3347c746a90
Graphics3d::ToScreen()を見てこれだと思ったのですが、旧版の関数であるらしくOpenSiv3Dで利用することができませんでした。
名前が変わったのでしょうか? それともOpenでは実装されていないのでしょうか?
旧版で組むのも手かとは思うのですが、出来ればOpenでやってみたいので何か知っている方がいればご教授お願いします。
Reputeless 2022/11/23(Wed) 21:16
BasicCamera3D::worldToScreenPoint() が使えます。
# include <Siv3D.hpp> // OpenSiv3D v0.6.6
void Main()
{
Window::Resize(1280, 720);
const ColorF backgroundColor = ColorF{ 0.4, 0.6, 0.8 }.removeSRGBCurve();
const MSRenderTexture renderTexture{ Scene::Size(), TextureFormat::R8G8B8A8_Unorm_SRGB, HasDepth::Yes };
DebugCamera3D camera{ renderTexture.size(), 30_deg, Vec3{ 10, 16, -32 } };
while (System::Update())
{
camera.update(2.0);
Graphics3D::SetCameraTransform(camera);
const Box box{ -8,2,0,4 };
{
const ScopedRenderTarget3D target{ renderTexture.clear(backgroundColor) };
box.draw(ColorF{ 0.8, 0.6, 0.4 }.removeSRGBCurve());
}
{
Graphics3D::Flush();
renderTexture.resolve();
Shader::LinearToScreen(renderTexture);
}
for (const auto& pos : box.getCorners())
{
if (const Vec3 screenPos = camera.worldToScreenPoint(pos);
0.0 < screenPos.z)
{
screenPos.xy().asCircle(5).draw();
}
}
}
}