Làm thế nào tôi có thể vẽ một quad-phối cảnh đúng?


7

Tôi đang cố gắng vẽ một hình tứ giác ở dạng 2D (trong SharpDX, nhưng về cơ bản đó là XNA). Nhưng hiệu chỉnh kết cấu không hoạt động và tôi chỉ nhận được một hình tứ giác có kết cấu.

nhập mô tả hình ảnh ở đây

Tôi đang sử dụng BasicEffectđể kết xuất nó.

BasicTextureEffect = new BasicEffect(Device)
{
    Alpha = 1.0f,

    TextureEnabled = true,
    LightingEnabled = false,
    VertexColorEnabled = true,

    Projection = Matrix.OrthoOffCenterLH(0.0f, ScreenWidth, ScreenHeight, 0.0f, 0.0f, 1.0f),
};

Đây là một game isometric 2D. Tôi có tọa độ giả 3D trong thế giới đẳng cự (đó là một cái bóng trên mặt đất) được chuyển đổi thành không gian màn hình, và sau đó được hiển thị bằng cách sử dụng DrawQuad.

Tôi có cần phải thiết lập chế độ xem (hoặc trình chiếu không?) Bằng cách nào đó, để 3D thực (mô phỏng máy ảnh đẳng cự), và sau đó vẽ hình tứ giác này theo tọa độ 3D thay thế? Cuối cùng thì thế nào? Hoặc có cách nào để sửa lỗi này trong 2D?

Cập nhật:

Tôi đã tải lên ảnh chụp màn hình một phần thực tế (Hình A), để bạn thấy nó gần giống nhau. (Tôi cắt nó một chút, nhưng nó đi vào góc)

Hình AHình B
            Hình A Hình B

Cập nhật 2:

Bây giờ tôi có thể xác nhận rằng SharpDX (XNA) đơn giản BasicEffectthực hiện điều này chỉ với ánh xạ UW đơn giản (4 góc của hình vuông) và đơn giản DrawQuad. Tôi đã tạm thời thay đổi nó để bao gồm điểm trung tâm và tôi vẽ 4 hình tam giác thay vì 2 (Hình B), điều này làm giảm hiệu quả đến mức tối thiểu, nhưng nó vẫn ở đó. Nó vẫn cần được giải quyết, vì tôi sẽ không chỉ sử dụng nó trên bóng tối.


Tại sao điều chỉnh phối cảnh không hoạt động?
Concept3d

Tôi thực sự không biết. Hiệu ứng (trên bóng tối hầu như không nhìn thấy) chỉ được nhận thấy một cách tình cờ, khi tôi thay đổi nó thành kết cấu bàn cờ. Nó hoàn toàn không được phát âm, nhưng nó chắc chắn có thể nhận ra là affine. Bạn không thể hỏi tôi câu hỏi mà về cơ bản tôi đang hỏi. Tại sao nó không hoạt động là câu hỏi? :)
SmartK8

Tương tự như câu hỏi này từ SO: stackoverflow.com/questions/15242507/ từ
Seth Battin

Tôi thực sự đã đọc nó, nhưng tôi không thể kết luận phải làm gì trong DirectX, có vẻ như OpenGL cụ thể như là giải pháp được trình bày.
SmartK8

3
Thật vậy, bạn có tìm thấy bài viết của Nathan Reed về nó không? reedbeta.com/blog/2012/05/26/quadrilonymous-interpolation-part-1
Seth Battin

Câu trả lời:


7

Tôi đã thay đổi shader theo bài báo được đề xuất bởi Seth Battin . Bây giờ nó thực hiện kết cấu quad chính xác. Phew, thịt xông khói giao:

nhập mô tả hình ảnh ở đây

Đối với các thế hệ tương lai có thể không bao giờ xảy ra. Đầu vào ở dạng các đỉnh của đường thẳng A1 / A2, B1 / B2 tạo ra các đường chéo (thay vì các đỉnh liên tiếp):

public static Vector3 DrawPerspectiveCorrectQuad(VertexWithPerspective v1, VertexWithPerspective v2, VertexWithPerspective v3, VertexWithPerspective v4)
{
    // detects intersection of two diagonal lines
    Single divisor = (v4.Position.Y - v3.Position.Y) * (v2.Position.X - v1.Position.X) - (v4.Position.X - v3.Position.X) * (v2.Position.Y - v1.Position.Y);
    Single ua = ((v4.Position.X - v3.Position.X) * (v1.Position.Y - v3.Position.Y) - (v4.Position.Y - v3.Position.Y) * (v1.Position.X - v3.Position.X)) / divisor;
    Single ub = ((v2.Position.X - v1.Position.X) * (v1.Position.Y - v3.Position.Y) - (v2.Position.Y - v1.Position.Y) * (v1.Position.X - v3.Position.X)) / divisor;

    // calculates the intersection point
    Single centerX = v1.Position.X + ua * (v2.Position.X - v1.Position.X);
    Single centerY = v1.Position.Y + ub * (v2.Position.Y - v1.Position.Y);
    Vector3 center = new Vector3(centerX, centerY, 0.5f);

    // determines distances to center for all vertexes
    Single d1 = (v1.Position - center).Length();
    Single d2 = (v2.Position - center).Length();
    Single d3 = (v3.Position - center).Length();
    Single d4 = (v4.Position - center).Length();

    // calculates quotients used as w component in uvw texture mapping
    v1.TextureCoordinate *= Single.IsNaN(d2) || d2 == 0.0f ? 1.0f : (d1 + d2)/d2;
    v2.TextureCoordinate *= Single.IsNaN(d1) || d1 == 0.0f ? 1.0f : (d2 + d1)/d1;
    v3.TextureCoordinate *= Single.IsNaN(d4) || d4 == 0.0f ? 1.0f : (d3 + d4)/d4;
    v4.TextureCoordinate *= Single.IsNaN(d3) || d3 == 0.0f ? 1.0f : (d4 + d3)/d3;

    // this is just PrimitiveBatch<VertexWithPerspective>
    // where VertexWithPerspective is basically VertexPositionTextureColor
    // with Vector3 (uvw) instead of Vector2 (uv) for texture coordinates
    // note: you need to create VertexWithPerspective yourself (decompilation ftw)
    PerspectivePrimitives.DrawQuad(v1, v3, v2, v4);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.