Страница 1 из 4

из куба сферу

СообщениеДобавлено: 05 окт 2018, 11:33
Cyrix
Здравствуйте!
Подскажите пожалуйста, как из куба "выдавить" сферу?

Re: из куба сферу

СообщениеДобавлено: 05 окт 2018, 11:38
IDoNotExist
Cyrix писал(а):Здравствуйте!
Подскажите пожалуйста, как из куба "выдавить" сферу?

Погуглить хотя бы 5 секунд. https://catlikecoding.com/unity/tutorials/cube-sphere/

Re: из куба сферу

СообщениеДобавлено: 05 окт 2018, 11:48
Cyrix
Упс... пропустил, СПАСИБО!!! :)

Re: из куба сферу

СообщениеДобавлено: 05 окт 2018, 12:12
Cyrix
Создал в 3д максе кубик, конвертнул в FBX и положил в Unity

приклеил вот этот скрипт:

Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class PlanetLOD : MonoBehaviour {
       
        Mesh m;
       
        // Use this for initialization
        void Start () {
                m = GetComponent<MeshFilter>().mesh;
               
                Vector3[] vertices = m.vertices;
                Vector3[] verticesN = m.vertices;
                Vector3[] normals = m.normals;
               
                for (int i = 0; i < vertices.Length; i++) {
                        verticesN[i].x = SphericalX (vertices[i].x, vertices[i].y, vertices[i].z);
                        verticesN[i].y = SphericalY (vertices[i].x, vertices[i].y, vertices[i].z);
                        verticesN[i].z = SphericalZ (vertices[i].x, vertices[i].y, vertices[i].z);
                }
                m.vertices = verticesN;
                m.RecalculateNormals();
               
               
        }
       
       
        float SphericalX (float x, float y, float z) {
                return x * Mathf.Sqrt (1.0F - y*y/2.0F - z*z /2.0F + y*y*z*z/3.0F);
        }
        float SphericalY (float x, float y, float z) {
                return y * Mathf.Sqrt (1.0F - z*z/2.0F - x*x/2.0F + z*z*x*x/3.0F);
        }
        float SphericalZ (float x, float y, float z) {
                return z * Mathf.Sqrt (1.0F - x*x/2.0F - y*y/2.0F + x*x*y*y/3.0F);
        }
}
 


получилась какая-то ерунда

Re: из куба сферу

СообщениеДобавлено: 08 окт 2018, 14:56
Cyrix
В примере объект создаётся из ничего. А как мне мой объект, созданный мною куб преобразовать в сферу?

Re: из куба сферу

СообщениеДобавлено: 08 окт 2018, 15:16
IDoNotExist
Cyrix писал(а):Создал в 3д максе кубик, конвертнул в FBX и положил в Unity

А почему ты в максе сразу не создашь нужную тебе кубо-сферу?

https://www.youtube.com/watch?v=nXOoSDR3BU8

Re: из куба сферу

СообщениеДобавлено: 08 окт 2018, 18:25
Cyrix
Можно и так конечно... но всё-таки хотелось бы понять, как это сделать средствами Unity3D

Re: из куба сферу

СообщениеДобавлено: 09 окт 2018, 14:58
Paul Siberdt
Cyrix писал(а):получилась какая-то ерунда

Вы бы показали на картинках, что за кубик создали и что за ерунда появилась. А-то домысливать и фантазировать, почему у вас получилась какая-то ерунда, можно бесконечно и непродуктивно. :)

Re: из куба сферу

СообщениеДобавлено: 09 окт 2018, 15:49
Cr0c
Тут же главное условие, чтобы в кубе вертексов было столько же, сколько в сфере. Так-то задача с примитивной математикой: у сферы все вертексы равноудалены от центра, у куба эти вертексы на одном расстоянии по одной из осей при угле до 45 градусов (по каждому из 6 направлений).

Re: из куба сферу

СообщениеДобавлено: 10 окт 2018, 00:49
Cyrix
На самом деле задача не из лёгких. Требуется создать маленькую планету с рельефом из карты высот. Я вчитывался, как сделать рельеф из карты высот на ПЛОСКОСТИ. Как я понял, необходимо сначала "изрельефить" все 6 плоских сторон куба, а уже потом "надуть" этот куб изнутри. Сетка куба весьма плотная. Честно говоря уже глаз дёргается. Не могу найти решения! Помогите пожалуйста!

Re: из куба сферу

СообщениеДобавлено: 10 окт 2018, 01:55
Cr0c
Cyrix писал(а):На самом деле задача не из лёгких. Требуется создать маленькую планету с рельефом из карты высот. Я вчитывался, как сделать рельеф из карты высот на ПЛОСКОСТИ. Как я понял, необходимо сначала "изрельефить" все 6 плоских сторон куба, а уже потом "надуть" этот куб изнутри. Сетка куба весьма плотная. Честно говоря уже глаз дёргается. Не могу найти решения! Помогите пожалуйста!

Боюсь, это так не сработает. Каким образом рельеф делается у тебя?
https://catlikecoding.com/unity/tutoria ... placement/
Но это для DX11, не для мобилок

Re: из куба сферу

СообщениеДобавлено: 10 окт 2018, 06:10
Paul Siberdt
Рельефить сферу - очень простая задача. От плоскости отличия лишь в направлении вертекса не вверх, а радиально от центра.

Изображение
Изображение

В качестве template я бы посоветовал не кубосферу юзать, а сфероид и не генерить его в рантайме, а подготовить пачку мешей с разной плотностью в качестве ресурсов.
Вот, "потренируйтесь на кошках" из вложения:

Re: из куба сферу

СообщениеДобавлено: 10 окт 2018, 12:58
Cyrix
А можно пример скрипта для данного сфероида?

Re: из куба сферу

СообщениеДобавлено: 10 окт 2018, 18:24
Paul Siberdt
Синтаксис:
Используется csharp
using UnityEngine;

public class Spheroid : MonoBehaviour
{
    private MeshFilter mf;
    private Mesh m;
    private Vector3[] vertices;

    private float noiseOffset;
    private float worldRadius;
    private float wavelength = 5.0f;

    void AddNoise(float _radius)
    {
        for (var i = 0; i < m.vertexCount; i++)
        {
            var v = GetPerlinVector(m.vertices[i], noiseOffset, wavelength, true).magnitude;
            vertices[i] = m.vertices[i] + _radius * m.normals[i] * v;
        }
        m.vertices = vertices;
    }

    void Start()
    {
        noiseOffset = Random.value * 10000f;

        mf = GetComponent<MeshFilter>();
        m = mf.mesh;
        vertices = m.vertices;
        worldRadius = m.vertices[0].magnitude;

        AddNoise(worldRadius);
        m.RecalculateNormals();
    }

    private Vector3 GetPerlinVector(Vector3 position, float offset, float wavelength, bool center)
    {
        return new Vector3(
            GetPerlin(position.x, position.y, offset, wavelength, center),
            GetPerlin(position.y, position.z, offset, wavelength, center),
            GetPerlin(position.x, position.z, offset, wavelength, center));
    }

    private float GetPerlin(float a, float b, float offset, float wavelength, bool center)
    {
        return Mathf.PerlinNoise(offset + a / wavelength, offset + b / wavelength) - (center ? 0.5f : 0f);
    }

}
 

Re: из куба сферу

СообщениеДобавлено: 11 окт 2018, 01:54
Cr0c
noiseOffset - это сид (seed, зерно) для генерации псевдорандомного шума