如何在Unity中在纹理上绘制圆形?

9

我尝试使用opencv和unity3d来寻找和显示角点。我通过unity相机进行捕捉。我将Texture2D发送到使用opencv的C++代码中。我使用opencv(Harris角检测器)检测角点。然后,C++代码会将角点的x,y位置(在图像上)发送给Unity代码。

最终,我想要展示这些点。我试图在Unity中的Texture2D上画圆。我使用下面的代码。但是Unity报错,说“UnityEngine.Texture2D不包含DrawCircle的定义,也没有发现类型为UnityEngine.Texture2D的DrawCircle扩展方法”。

我该如何在Unity3D中绘制简单的形状?

    Texture2D texture = new Texture2D(w, h,TextureFormat.RGB24 , false);
    texture.DrawCircle(100, 100, 20, Color.green);
    // Apply all SetPixel calls
    texture.Apply();
    mesh_renderer.material.mainTexture = texture;

“这并不难。” - user585968
1
可能是如何在Unity3D中绘制圆形?的重复问题。 - user585968
我找到了一个项目。它可以绘制圆形、直线等等。在这里[https://github.com/ProtoTurtle/BitmapDrawingExampleProject]。 - zakjma
我找到了一个项目。它可以绘制圆形、线条等等。这是链接:[github.com/ProtoTurtle/BitmapDrawingExampleProject],但是如果你打开链接会显示“404页面未找到”的错误信息。 - user585968
2
删除URL中的最后一个字符,它是"]"。请再试一次。 - zakjma
2个回答

10

来自@ChrisH的更优化的解决方案
(原始方案在我尝试在1000x1000纹理上绘制300个圆时,让我的电脑变慢了2分钟,而新方案则立即完成,因为避免了额外的迭代)

public static Texture2D DrawCircle(this Texture2D tex, Color color, int x, int y, int radius = 3)
{
    float rSquared = radius * radius;

    for (int u = x - radius; u < x + radius + 1; u++)
        for (int v = y - radius; v < y + radius + 1; v++)
            if ((x - u) * (x - u) + (y - v) * (y - v) < rSquared)
                tex.SetPixel(u, v, color);

    return tex;
}

有趣的是,经过3年后我又回到了谷歌,并提出了同样的问题。 - IC_

4

只需为Texture2D创建一个扩展方法。

public static class Tex2DExtension
{
    public static Texture2D Circle(this Texture2D tex, int x, int y, int r, Color color)
    {
        float rSquared = r * r;

        for (int u=0; u<tex.width; u++) {
            for (int v=0; v<tex.height; v++) {
                if ((x-u)*(x-u) + (y-v)*(y-v) < rSquared) tex.SetPixel(u,v,color);
            }
        }

        return tex;
    }
}

除了检测附近的像素,您有什么想法如何创建纯轮廓? - user14803978
我想通了。在它上面再画一个圆,但使用clear,并且相对于所需的厚度更小。 - user14803978

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接