Unity: мягко обернуть сетку вокруг другой сетки?

Учитывая одну сетку (например, кубический объект слева) и другую настраиваемую сферическую сетку (справа; это могла бы быть другая форма, если бы проще), как в Unity и C # во время выполнения можно мягко обернуть вторую сетку вокруг первой? ? Спасибо!

введите описание изображения здесь


person Philipp Lenssen    schedule 25.06.2018    source источник


Ответы (1)


Следующий подход, благодаря VirtualMethodStudio за указатель, берет сферу-оболочку, которая затем для каждой вершины в ней отбрасывает луч внутрь и настраивает эту вершину на точку попадания:

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

public class ShrinkWrapSphere : MonoBehaviour {

    void Start() {
        Debug.Log("Starting...");

        MeshFilter meshFilter = gameObject.GetComponent<MeshFilter>();
        Mesh mesh = meshFilter.mesh;

        Vector3[] vertices = new Vector3[mesh.vertices.Length];
        System.Array.Copy(mesh.vertices, vertices, vertices.Length);

        for (int i = 0; i < vertices.Length; i++) {
            Vector3 rayDirection = -mesh.normals[i];

            RaycastHit hit;
            if ( Physics.Raycast( vertices[i], rayDirection, out hit, 100f ) ) {
                vertices[i] = hit.point * 2f;
            }
            else {
                vertices[i] = Vector3.zero;
            }
        }

        mesh.vertices = vertices;

        Debug.Log("Done. Vertices count " + vertices.Length);

        // mesh.RecalculateBounds();
        // mesh.RecalculateNormals();
        // mesh.RecalculateTangents();
    }

}

введите описание изображения здесь

Результирующую сетку затем можно упростить с помощью функции Simplify this актив.

Альтернативой приведенному выше является использование Collider.ClosestPoint (vertexPoint).

person Philipp Lenssen    schedule 25.06.2018