球の内側にテクスチャを貼りたい
nc 2021/12/14(Tue) 18:06
3D空間に球を配置し、全天球画像を貼り付けることは出来ました。
デバッグカメラで外側からは見れますが、球の内側に入ると何も見えません。
やりたいこと
・球を配置し、内側にテクスチャを貼る
・カメラを球の中心(球の中)に置く
・球の中心から球の表面内側を眺める
過去スレを見ましたが、バージョンの関係か最新のopenSiv3D v0.6.3 では上手くいきません。
どなたかお力添えいただけると幸いです。
よろしくお願いいたします。
参考過去スレ
https://siv3d.jp/bbs/patio.cgi?read=6&ukey=0&log=past
https://siv3d.jp/bbs/patio.cgi?read=46&ukey=1
Reputeless 2021/12/19(Sun) 10:36
三角形の裏面を描画するかは RasterizerState の cullMode で決まっています。
3D 描画におけるデフォルトは RasterizerState::Default3D (RasterizerState{ FillMode::Solid, CullMode::Back }) なので、
次のように裏面のカリングを無効にすると良いです。
# include <Siv3D.hpp> // OpenSiv3D v0.6.3
void Main()
{
Window::Resize(1280, 720);
const ColorF backgroundColor = ColorF{ 0.4, 0.6, 0.8 }.removeSRGBCurve();
const Texture uvChecker{ U"example/texture/uv.png", TextureDesc::MippedSRGB };
const Texture earthTexture{ U"example/texture/earth.jpg", TextureDesc::MippedSRGB };
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);
// 3D 描画
{
const ScopedRenderTarget3D target{ renderTexture.clear(backgroundColor) };
Plane{ 64 }.draw(uvChecker);
{
// カリングを無効に
const ScopedRenderStates3D rs{ RasterizerState::SolidCullNone };
Sphere{ 0, 2, 0, 2 }.draw(earthTexture);
}
for (auto i : Range(-4, 4))
{
Sphere{ (i * 4), 1, 8, 1 }.draw(HSV{ i * 20 }.removeSRGBCurve());
}
for (auto i : Range(-4, 4))
{
Sphere{ (i * 4), 1, -8, 0.5 }.draw(ColorF{ 0.5 + i * 0.125 }.removeSRGBCurve());
}
}
// 3D シーンを 2D シーンに描画
{
Graphics3D::Flush();
renderTexture.resolve();
Shader::LinearToScreen(renderTexture);
}
}
}
なお、法線方向は相変わらず外側なので、ライティングのために法線を内側を向かせたい場合は MeshData::Sphere() で球の MeshData を作り、全頂点の法線を反転させてから Mesh を作ると、法線が全部内側を向いた球を作れます。
天球(空)のテクスチャを貼る場合は、太陽光を無効にしてグローバル環境光を ColorF{ 1.0 } にすることで、テクスチャの色をそのまま反映させることができます。
nc 2022/02/01(Tue) 18:34