跳到正文
Qiita · Unity 开发社区· 来源· houwou·· 3 小时前AI 评分12

ReliefCanvas Morie 基于 Unity 6.6 实现 Voxel 堆叠绘制基础功能

【お絵かきアプリ開発#1】Voxelを積み重ねて描画する基本動作 - ReliefCanvas Morie

正文 · AI 翻译

0

转到点赞用户列表

0

在 X (Twitter) 上分享

在 Facebook 上分享

添加到 Hatena Bookmark

删除文章

已删除的文章无法恢复。

本文的草稿也会被删除。

您确定要删除这篇文章吗??

前言

本次尝试开发的应用并非在平面上以像素为单位排列颜色的传统绘画应用,而是通过堆叠体素(Voxel)来实现立体绘画的应用。
希望借助体素实现那些在平面上无法充分表现的质感,例如颜料隆起的立体感、画布的凹凸不平,以及颜料之间的混合效果等。
因此,首先将目标设定为创建仅具备“在点击位置放置体素”和“进行堆叠”功能的最小化脚本。

環境

Unity 6.6 + VSCode

脚本

  1. 在 Unity 中创建新的 3D 项目
  2. 在画面上放置 Plane(画布)
  3. 选中创建的 Plane,点击右侧 Inspector 窗口中的 Tag
  4. 选择 Add Tag...,点击 + 按钮添加名为 Ground 的标签并保存
  5. 再次选中 Plane,将 Tag 更改为 Ground
  6. 通过 GameObject ➔ 3D Object ➔ Cube 创建立方体
  7. 在画面下方的 Project 窗口的空白区域,将屏幕上的 Cube 拖放上去,图标变为蓝色并“预制化(原始数据)”。
  8. 屏幕上的(Hierarchy 中的)Cube 不再需要,因此右键删除。
  9. 通过 GameObject ➔ Create Empty 创建空对象,并将其命名为 VoxelManager。
  10. 将创建的 VoxelPainter.cs 拖放到 VoxelManager 上进行附加。
  11. VoxelManager 的 Inspector 中有名为 Voxel Prefab 的项目,将刚才创建的 Cube 拖放到其中进行设置。
  12. VoxelPainter.cs 中输入以下代码。

VoxelPainter.cs

using UnityEngine;
using UnityEngine.InputSystem; // 新しいInput Systemを使用

public class VoxelPainter : MonoBehaviour
{
    [Header("設定")]
    public GameObject voxelPrefab; // 配置するボクセルのプレハブ(Cube)
    public float voxelSize = 1.0f;  // ボクセルのサイズ

    void Update()
    {
        // マウスが接続されていない場合は処理しない
        if (Mouse.current == null) return;

        // マウス左クリックでボクセルを設置
        if (Mouse.current.leftButton.wasPressedThisFrame)
        {
            PlaceVoxel();
        }
        // マウス右クリックでボクセルを削除(彫る)
        else if (Mouse.current.rightButton.wasPressedThisFrame)
        {
            RemoveVoxel();
        }
    }

    void PlaceVoxel()
    {
        // 現在のマウス座標を取得
        Vector2 mousePos = Mouse.current.position.ReadValue();
        Ray ray = Camera.main.ScreenPointToRay(mousePos);

        if (Physics.Raycast(ray, out RaycastHit hit))
        {
            // クリックした面(法線)の方向に1マスずらした位置を計算
            Vector3 targetPosition = hit.point + (hit.normal * (voxelSize * 0.5f));
            
            // グリッド(1.0刻み)にスナップさせる
            Vector3 gridPosition = new Vector3(
                Mathf.Floor(targetPosition.x / voxelSize) * voxelSize + (voxelSize * 0.5f),
                Mathf.Floor(targetPosition.y / voxelSize) * voxelSize + (voxelSize * 0.5f),
                Mathf.Floor(targetPosition.z / voxelSize) * voxelSize + (voxelSize * 0.5f)
            );

            // ボクセルを生成
            Instantiate(voxelPrefab, gridPosition, Quaternion.identity);
        }
    }

    void RemoveVoxel()
    {
        Vector2 mousePos = Mouse.current.position.ReadValue();
        Ray ray = Camera.main.ScreenPointToRay(mousePos);

        if (Physics.Raycast(ray, out RaycastHit hit))
        {
            // クリックした対象がPlane(キャンバス)でなければ削除
            if (hit.collider.gameObject.tag != "Ground")
            {
                Destroy(hit.collider.gameObject);
            }
        }
    }
}

結果

虽然只是在白色画布上逐个堆叠白色体素的基础操作,但成功实现了自由创建立体模型。
感觉就像在玩纯白色的《我的世界》(Minecraft)。
今后将依次尝试引入调色板、光影调整以及相机操作。

应用程序名称

该绘画应用将以 ReliefCanvas Morie 的名称推进后续项目。
名称取自从平面浮现立体的「浮雕(Relief)」绘画与「盛绘(Morie)」,组合成一个简单且易于记忆的名字。

0

前往点赞用户列表

0

注册为新用户并更便捷地使用 Qiita

  1. 获取符合您需求的文章
  2. 您可以高效地回顾有用的信息
  3. 您可以使用深色主题

注册后您可以做什么

0

前往查看点赞用户的列表

0

删除文章

已删除的文章无法恢复。

该文章的草稿也将被删除。

您确定要删除此文章吗?

来源:Qiita · Unity 开发社区 · qiita.com