如何使客户形状变形?

问题描述

我有一个 sf::RectangleShape 2D 立方体,我想创建功能来为那个立方体绘制“像 3D”的边。
这是我的解决方案:

                //X. Y
//gonyometric latters for clearity
sf::Vector2f A(300,500);
sf::Vector2f B(500,500);
sf::Vector2f E(300,300);
sf::Vector2f F(500,300);

sf::RectangleShape cube;
cube.setPosition(300,300);
cube.setSize(sf::Vector2f(200,200));

cube.setTexture(&brick_texture);

// convex shape
sf::ConvexShape rightSide;

rightSide.setPointCount(4);
rightSide.setPosition(B);

rightSide.rotate(-45);


rightSide.setPoint(0,sf::Vector2f(0,0));
sf::Vector2f C(100,0);
rightSide.setPoint(1,C);
sf::Vector2f D(100+(200 * getSin(45)),(0-200* getCos(45)));

rightSide.setPoint(2,D);

rightSide.setPoint(3,sf::Vector2f(0 + (200 * getSin(45)),(0 - 200 * getCos(45))));

rightSide.setTexture(&brick_texture);

这是它的样子:

drawed cube

我不知道如何将纹理的形状编辑为 rightSide 的形状以使其真正像 3D。

解决方案:

我使用 sf::Transform 的客户矩阵来管理形状变形。并用矩形代替凸面。

制作它的最快和最简单的方法是使用认参数创建整个矩阵并更改您想要的值。其他更复杂的解决方案是从您的形状中获取矩阵,将其转换为 4x4 循环内的浮动数组(在这里您可以使用可爱的开关编辑其元素)并将该数组的一部分正确绑定到新的 3x3 矩阵。

这是结果:

solved

解决方法

我认为您可以通过将自定义的 sf::Transform 传递给您的 draw 调用(如 here 所述)来实现。

对于正交投影,我认为您只需要 shear transformation。但是,sf::Transform 不支持开箱即用的剪切,因此您必须自己构建矩阵。 (请注意,您不必构建整个变换矩阵,只需构建剪切部分。然后您可以使用类似 customTransform * sprite.getTransform() 之类的东西。)

或者,您可以只创建 看起来 3D 的精灵,然后以适当的顺序将它们分层以构建您的场景。