unity 在模型上绘画

using UnityEngine;
/// <summary>
/// 在模型上绘画
/// </summary>
public class DrawOnModel:BaseMonoBehaviour{
    [Tooltip("颜色")]
    public Color color=Color.cyan;
    [Tooltip("笔刷大小")]
    public float brushSize=10f;
    private Camera m_mainCamera;
    private Texture2D m_texture2D;
    protected override void Awake(){
        base.Awake();
        m_mainCamera=Camera.main;
        //创建一个副本,避免修改原纹理
        Renderer renderer=GetComponent<Renderer>();
        Texture2D mainTexture=(Texture2D)renderer.material.mainTexture;
        Texture2D tempTexture2D=new Texture2D(mainTexture.width,mainTexture.height);
        tempTexture2D.SetPixels(mainTexture.GetPixels());
        tempTexture2D.Apply();
        renderer.material.mainTexture=tempTexture2D;
        m_texture2D=tempTexture2D;
    }

    protected override void Update2(){
        base.Update2();
        if(Input.GetMouseButton(0)){
            RaycastHit[] raycastHits=new RaycastHit[1];
            Physics.RaycastNonAlloc(m_mainCamera.ScreenPointToRay(Input.mousePosition),raycastHits);
            var hit=raycastHits[0];
            if(hit.collider!=null&&hit.collider.gameObject==gameObject){
                DrawCircleDot(hit.textureCoord,m_texture2D,color,brushSize);
                //DrawRectDot(hit.textureCoord,m_texture2D,color,brushSize);
            }
        }
    }

    /// <summary>
    /// 画矩形点
    /// </summary>
    /// <param name="point">坐标</param>
    /// <param name="texture">贴图</param>
    /// <param name="color">颜色</param>
    /// <param name="width">宽度</param>
    private void DrawRectDot(Vector2 point,Texture2D texture,Color color,float width){
        point.x*=texture.width;
        point.y*=texture.height;

        point.x-=width*0.5f;
        point.y-=width*0.5f;

        int x=Mathf.FloorToInt(point.x);
        int y=Mathf.FloorToInt(point.y);

        for (int i=0;i<width;i++){
            for (int j=0;j<width;j++){
                texture.SetPixel(x+i,y+j,color);
            }
        }
        texture.Apply();
    }

    /// <summary>
    /// 画圆形点
    /// </summary>
    /// <param name="point">坐标</param>
    /// <param name="texture">贴图</param>
    /// <param name="color">颜色</param>
    /// <param name="diameter">直径</param>
    private void DrawCircleDot(Vector2 point,Texture2D texture,Color color,float diameter){
        float radius=diameter*0.5f;

        point.x*=texture.width;
        point.y*=texture.height;

        point.x-=radius;
        point.y-=radius;

        int x=Mathf.FloorToInt(point.x);
        int y=Mathf.FloorToInt(point.y);

        for (int i=0;i<diameter;i++){
            for (int j=0;j<diameter;j++){
                float dx=i-radius;
                float dy=j-radius;
                float distance=Mathf.Sqrt(dx*dx+dy*dy);
                if(distance<=radius){
                    texture.SetPixel(x+i,y+j,color);
                }
            }
        }
        texture.Apply();
    }

}

原文地址:https://www.cnblogs.com/kingBook/p/12283840.html

时间: 2024-10-14 06:55:34

unity 在模型上绘画的相关文章

iPad上绘画创作利器Paper53

Paper 53在很早之前我们就为大家推荐过,上周这款App也迎来了首次无内购免费促销,目前所有的笔刷都可以免费使用,如果你有在iPad上绘画的需求,那么Paper 53绝对是你的最佳选择,如果你想更深度的体验Paper 53,买一根Pencil 53蓝牙触控笔也是值得的. 每日佳软:iPad上绘画创作利器Paper53 Paper53 Paper 53的界面设计十分漂亮,有笔记本收集癖的用户肯定会喜欢默认的笔记封面.Paper by 53 提供的绘图工具从左到右依次是:橡皮.钢笔.铅笔.马克笔

unity3d动画帧事件回调脚本必须直接挂在模型上

unity3d动画帧事件回调脚本必须直接挂在模型上,即与Animator同级,不能挂接在模型的父节点或者子节点,否则无法找到回调函数 以上在idle动作中新增帧事件skill,回调模型脚本中的skill()函数

201507221403_《backbone之一——新建模型和集合、实例化模型、模型上监听事件的方法、模型设置和获取后台数据、配置理由方法、视图绑定事件的方法、绑定模型等》

一 . 新建 var model_1 = new Backbone.Model({'name':'hello'}); var model_2 = new Backbone.Model({'name':'hi'}); var models = new Backbone.Collection(); models.add( model_1 ); models.add( model_2 ); alert( JSON.stringify(models) ); 二. 实例化模型 var M = Backbo

Linux内核(7) - 设备模型(上)

对于驱动开发来说,设备模型的理解是根本,毫不夸张得说,理解了设备模型,再去看那些五花八门的驱动程序,你会发现自己站在了另一个高度,从而有了一种俯视的感觉,就像凤姐俯视知音和故事会,韩峰同志俯视女下属. 顾名而思义就知道设备模型是关于设备的模型,既不是任小强们的房模,也不是张导的炮模.对咱们写驱动的和不写驱动的人来说,设备的概念就是总线和与其相连的各种设备了.电脑城的IT工作者都会知道设备是通过总线连到计算机上的,而且还需要对应的驱动才能用,可是总线是如何发现设备的,设备又是如何和驱动对应起来的,

解决Unity中模型部件的MeshCollider不随动画一起运动的问题

Unity的3d游戏开发中,经常遇到需要将模型的某一部分(比如武器),单独做碰撞处理的情况. 导入模型后,给武器部分添加MeshCollider,MeshCollider的Mesh通常包含在模型里,如图: 勾选MeshCollider的Convex以及Inflate mesh后,在场景中能看到生成的绿色网格碰撞器. 但是运行后,会发现这个Collider并不随着模型动画一起运动. 不知道是不是问题太小白的原因,网上很少有相关问题的讨论,不少相关的问题都没有答案. 最终在csdn上翻到一篇文章,解

iOS - Scenekit3D引擎初探之 - 导入模型+上传服务器+下载并简单设置

SceneKit是ios8之后苹果推出了一个3D模型渲染框架. SceneKit现在可以支持有限的几种模型,截止到我写这篇文章为止似乎只有.dae和.abc后一种模型我没有使用过.这篇文章只针对.dae模型写. 首先如果是希望加载一个已有的,不需要程序在运行的时候动态添加的dae模型.那么我们可以直接新建一个game类型的工程.在选项中选择SceneKit,在程序中加载自带模型的那句话中将模型名称替换即可.本文主要讲一下如何导出dae模型,并在server端动态下载并显示. 首先我们手中有一个.

使用Unity在MVC上实现动态注入

一.前言 通过前一篇的文章介绍使用unity轻量级的依赖注入容器,本文就介绍在MVC上使用unity依赖注入控制器和控制器中的日志属性. 实现MVC中新提供 的两个接口:IDependencyResolver和  IControllerActivator 二.代码实现 自定义创建CustomControllerActivator类实现IControllerActivator接口的方法 public class CustomControllerActivator : IControllerActi

第 16 章 CSS 盒模型[上]

学习要点: 1.元素尺寸 2.元素内边距 3.元素外边距 4.处理溢出 主讲教师:李炎恢 本章主要探讨 HTML5 中 CSS 盒模型,学习怎样了解元素的外观配置以及文档的整体布局. 一.元素尺寸 CSS 盒模型中最基础的就是设置一个元素的尺寸大小.有三组样式来配置一个元素的尺寸大小,样式表如下: 属性 值 说明 CSS 版本 width auto.长度值或百分比 设置元素的宽度 1 height auto.长度值或百分比 设置元素的高度 1 min-width auto.长度值或百分比 设置元

unity打包模型存在的一个问题

http://blog.csdn.net/leonwei/article/details/39233747 发现U3D的模型打包可能存在一个bug,会导致发布到手机上的模型法线丢失(某些材质下变成全黑或全白,编辑器里正常),经查明和测试,解决这个问题的方法: 1.对于在MAX中着了顶点色的模型(或者使用了需要顶点色参与的shader),导入模型时不要同时导入材质,要制作成预置后再指定材质,即 这里不要勾选 2.对于那些没有着顶点色的模型,如果这里选了导入材质,请保证将对应生成的材质上传 3.最最