如何在 X 轴上镜像 3D 网格

Posted

技术标签:

【中文标题】如何在 X 轴上镜像 3D 网格【英文标题】:How to mirror a 3D mesh on the X axis 【发布时间】:2021-11-22 22:12:22 【问题描述】:

我正在开发一个 C++ 3D 游戏,当我从屏幕上的 glTF 文件加载网格时,我遇到了问题。 This 是我要加载的 3D 模型。

我正在使用 DirectX 11。

如您所见,网格在 X 轴上翻转,我不知道如何才能翻转看起来正常。

这就是我想要的样子。

    struct VS_INPUT
    
        float4 position: POSITION0;
        float2 texcoord: TEXCOORD0;
        float3 normal: NORMAL0;
    ;
    
    struct VS_OUTPUT
    
        float4 position: SV_POSITION;
        float2 texcoord: TEXCOORD0;
        float3 normal: NORMAL0;
        float3 direction_to_camera: TEXCOORD1;
    ;
    
    
    cbuffer constant: register(b0)
    
        row_major float4x4 m_world;
        row_major float4x4 m_view;
        row_major float4x4 m_proj;
    
        float4 m_light_direction;
        float4 m_camera_position;
    
        float4 m_light_position;
        float m_light_radius;
    ;
    
    
    
    VS_OUTPUT vsmain(VS_INPUT input)
    
        VS_OUTPUT output = (VS_OUTPUT)0;
    
        // WORLD SPACE
        output.position = mul(input.position, m_world);
        output.direction_to_camera = normalize(output.position - m_camera_position.xyz);
        // VIEW SPACE
        output.position = mul(output.position, m_view);
        // SCREEN SPACE
        output.position = mul(output.position, m_proj);
    
    
        output.texcoord = input.texcoord;
        output.normal = normalize(mul(input.normal, m_world));
        return output;
    

这是我正在使用的顶点着色器。

【问题讨论】:

【参考方案1】:
output.position.x = -output.position.x; in vertex shader

或者在加载网格和解析顶点时反转顶点的 x 坐标。

v.x = -v.x;

或在 x 轴上缩放 -1 应该可以解决问题。

SetScale( -1.0f, 1.0f, 1.0f );

【讨论】:

我在解析顶点时反转了 x 轴,但网格似乎从里向外翻了 imgur.com/a/HtjoVV9 imgur.com/a/aOR040k 试试顶点着色器然后告诉我... 顶点着色器的结果完全相同:( 尝试在 x 轴上缩放 -1 我已经在 x 轴上反转了刻度,但结果似乎是一样的imgur.com/a/dLk2GB9

以上是关于如何在 X 轴上镜像 3D 网格的主要内容,如果未能解决你的问题,请参考以下文章

从顶点数组生成三角形网格的算法

使用鼠标光标在特定轴上拖动 3D 对象

如何从3D不规则数据中切割2D网格?

如何使用 Actionscript 3 为在 z 轴上弹跳的球设置动画?

Plotly:如何为 x 轴上的时间序列设置主要刻度线/网格线的值?

三 JS / 动画在其 Y 轴上的网格旋转到面方向