使用Raycasts.TextureCoord绘制到3d对象 - 而不是绘图

时间:2018-05-26 18:52:33

标签: c# unity3d

我目前正在开发一款游戏,您可以使用鼠标在3d对象上绘制,但是当我使用鼠标绘制时,它不会标记纹理。我正在使用Unity Personal Edition。我按照Raycast.TextureCoord文档进行了示例。我使用了以下C#代码,几乎与示例完全相同:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Paint : MonoBehaviour
{
    public Camera cam;

    void Start()
    {
        cam = GetComponent<Camera>();
    }

    void Update()
    {
        if (!Input.GetMouseButton(0))
            return;

        RaycastHit hit;
        if (!Physics.Raycast(cam.ScreenPointToRay(Input.mousePosition), out hit))
            return;

        Renderer rend = hit.transform.GetComponent<Renderer>();
        MeshCollider meshCollider = hit.collider as MeshCollider;

        if (rend == null || rend.sharedMaterial == null || rend.sharedMaterial.mainTexture == null || meshCollider == null)
            return;

        Texture2D tex = rend.material.mainTexture as Texture2D;
        Vector2 pixelUV = hit.textureCoord;
        pixelUV.x *= tex.width;
        pixelUV.y *= tex.height;

        tex.SetPixel((int)pixelUV.x, (int)pixelUV.y, Color.black);
        tex.Apply();
    }
}

我在一个名为paint的脚本中有这个代码。我创建了一个空项目,它具有一个纹理,读取和写入模式打开,凸起关闭。相机面向立方体和平面。没有任何移动功能。只有一个摄像头,附有连接主摄像头的油漆c#脚本。我按照说明操作,但是当我点击它时,它不会在立方体上绘画。为什么是这样?如何让它涂在立方体上。

道歉,如果这是显而易见的,因为我是团结的新手。

enter image description here enter image description here

1 个答案:

答案 0 :(得分:1)

Raycast.TextureCoord适用于MeshCollider而不是BoxCollider。在Raycast.TextureCoord上使用BoxCollider时,对于Vector2,它将返回0,0。从多维数据集游戏对象中删除BoxCollider,然后将MeshCollider附加到它,它应该可以正常工作。

修改

  

为什么我不能在飞机上做呢? -

您可以在飞机上进行并且它可以在飞机上工作,但由于绘图太小,您无法看到它。从“场景”视图放大平面或使用“游戏”视图上的滑块放大对象,您将看到绘图。这是因为你绘制的区域太小了。你也在棕色纹理上画黑色,这样就更难看了。用红色来表示这个。

下面的示例添加了SIZE变量以增加您要绘制的区域。 5的值应该很好,它使用红色而不是棕色来绘制它,以便您可以清楚地看到它。请注意,整个绘图应该使用着色器或OpenGL来完成,但为了解决您的问题,我将坚持使用Raycasts.TextureCoord

public Camera cam;
public int SIZE = 5;

void Start()
{
    cam = GetComponent<Camera>();
}

void Update()
{
    if (!Input.GetMouseButton(0))
        return;

    RaycastHit hit;
    if (!Physics.Raycast(cam.ScreenPointToRay(Input.mousePosition), out hit))
        return;


    Renderer rend = hit.transform.GetComponent<Renderer>();
    MeshCollider meshCollider = hit.collider as MeshCollider;

    if (rend == null || rend.sharedMaterial == null || rend.sharedMaterial.mainTexture == null || meshCollider == null)
        return;

    Texture2D tex = rend.material.mainTexture as Texture2D;
    Vector2 pixelUV = hit.textureCoord;

    pixelUV.x *= tex.width;
    pixelUV.y *= tex.height;

    //Expand where to draw on both direction
    for (int i = 0; i < SIZE; i++)
    {
        int x = (int)pixelUV.x;
        int y = (int)pixelUV.y;

        //Increment the X and Y
        x += i;
        y += i;

        //Apply
        tex.SetPixel(x, y, Color.red);

        //De-increment the X and Y
        x = (int)pixelUV.x;
        y = (int)pixelUV.y;

        x -= i;
        y -= i;

        //Apply
        tex.SetPixel(x, y, Color.red);
    }
    tex.Apply();
}