Исходник Велосипеды без педалей

Начинающий
Статус
Оффлайн
Регистрация
17 Май 2018
Сообщения
3
Реакции[?]
0
Поинты[?]
0
C++:
bool WorldToScreen(const Vec3& worldPos, Vec3& screenPos, const Matrix44& proj, const Matrix44& view, float width, float height)
{
    Vec4 out = Vec4{ worldPos, 1 } *view * proj;

    if (out.w == 0.0f)
        return false;

    screenPos.x = (1 + out.x / out.w) * width * 0.5f;
    screenPos.y = (1 - out.y / out.w) * height * 0.5f;
    screenPos.z = out.z / out.w;

    return screenPos.z > 0.0f && screenPos.z < 1.0f;
}
C++:
bool WorldToScreen(const Vec3& worldPos, Vec3& screenPos, const Matrix44& proj, const Matrix44& view, float width, float height)
{
    Vec4 temp =
    {
        view.m00 * worldPos.x + view.m10 * worldPos.y + view.m20 * worldPos.z + view.m30,
        view.m01 * worldPos.x + view.m11 * worldPos.y + view.m21 * worldPos.z + view.m31,
        view.m02 * worldPos.x + view.m12 * worldPos.y + view.m22 * worldPos.z + view.m32,
        view.m03 * worldPos.x + view.m13 * worldPos.y + view.m23 * worldPos.z + view.m33
    };
    Vec4 out =
    {
        proj.m00 * temp.x + proj.m10 * temp.y + proj.m20 * temp.z + proj.m30 * temp.w,
        proj.m01 * temp.x + proj.m11 * temp.y + proj.m21 * temp.z + proj.m31 * temp.w,
        proj.m02 * temp.x + proj.m12 * temp.y + proj.m22 * temp.z + proj.m32 * temp.w,
        proj.m03 * temp.x + proj.m13 * temp.y + proj.m23 * temp.z + proj.m33 * temp.w
    };

    if (out.w == 0.0f)
        return false;

    screenPos.x = (1 + out.x / out.w) * width * 0.5f;
    screenPos.y = (1 - out.y / out.w) * height * 0.5f;
    screenPos.z = out.z / out.w;

    return screenPos.z > 0.0f && screenPos.z < 1.0f;
}
 
Начинающий
Статус
Оффлайн
Регистрация
17 Май 2018
Сообщения
3
Реакции[?]
0
Поинты[?]
0
C++:
class CWorldToScreen
{
public:
    void update(IRenderer* pRenderer)
    {
        Matrix44 proj, view;
        pRenderer->GetProjectionMatrix(&proj.m00);
        pRenderer->GetModelViewMatrix(&view.m00);

        m_height = pRenderer->GetHeight();
        m_width = pRenderer->GetWidth();

        m_matrix = view * proj;
    }
    bool operator ()(const Vec3& worldPos, Vec3& screenPos)
    {
        Vec4 out =
        {
            worldPos.x * m_matrix.m00 + worldPos.y * m_matrix.m10 + worldPos.z * m_matrix.m20 + m_matrix.m30,
            worldPos.x * m_matrix.m01 + worldPos.y * m_matrix.m11 + worldPos.z * m_matrix.m21 + m_matrix.m31,
            worldPos.x * m_matrix.m02 + worldPos.y * m_matrix.m12 + worldPos.z * m_matrix.m22 + m_matrix.m32,
            worldPos.x * m_matrix.m03 + worldPos.y * m_matrix.m13 + worldPos.z * m_matrix.m23 + m_matrix.m33
        };

        if (out.w == 0.0f)
            return false;

        screenPos.x = (1 + out.x / out.w) * m_width * 0.5f;
        screenPos.y = (1 - out.y / out.w) * m_height * 0.5f;
        screenPos.z = out.z / out.w;

        return screenPos.z > 0.0f && screenPos.z < 1.0f;
    }
   
private:
    Matrix44 m_matrix;
    float m_width;
    float m_height;
};
 
Сверху Снизу