球の内側にテクスチャを貼りたい
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
ご丁寧に解説ありがとうございます。
試行錯誤していると、半径の値をマイナスにすることでも目的の挙動が確認できたのですが、

Sphere{ 0, 2, 0, -100 }.draw(earthTexture);

のような書き方です。
こちらのやり方では何か不具合が出てくるのでしょうか?
編集
Reputeless (Author of Siv3D)  2022/02/02(Wed) 18:24
将来のバージョンにおいて、負の半径で同じ挙動が再現できるかは保証されません。
編集
件名
Re: 球の内側にテクスチャを貼りたい
名前
コメント
画像添付


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

- WEB PATIO -