Я делаю игру в Unity с резиновым мячом для одного из объектов. Я просмотрел различные доступные активы с мягкой физикой тела, и никто из них не смотрит, особенно то, что я ищу. Я хочу запрограммировать мяч, который будет подпрыгнуть, и своего рода растянувшись, когда он попадает на землю. Это будет центральной точкой для моей игры, и я хочу, чтобы она выглядела настолько хорошо, как я могу ее получить, однако все решения, которые я нахожу в Интернете, - это небольшие патчи или плохо написанные. Я также хотел бы изучить решение, чтобы я мог адаптироваться и учиться на нем в будущем, я не хочу просто покупать актив и бросать его в игру. Однако они казались исключительно сложными для моих потребностей, и я был привлечен к его мягкой сфере видео, где они не работали правильно. В конце концов я обнаружил, что кодировка кошатся и их деформации сетки на основе векторов и тому подобного. Это работает очень хорошо визуально, но адаптируя его к моим нуждам, это значительно более сложно, я бы надеялся. < /p>
Изменить 2: я добавил остальную часть этого класса, чтобы лучше показать функции < /p>
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MeshDeformerInput : MonoBehaviour
{
public float force = 10f;
public float forceOffset = 0.01f;
void HandleInput(Ray inputRay)
{
RaycastHit hit;
Debug.DrawRay(inputRay.origin, inputRay.direction * 50000000, Color.red);
if (Physics.Raycast(inputRay, out hit))
{
MeshDeformer deformer = hit.collider.GetComponent();
if (deformer)
{
Vector3 point = hit.point;
point += hit.normal * forceOffset;
deformer.AddDeformingForce(point, force);
}
}
}
void OnCollisionStay(Collision collision)
{
foreach (ContactPoint contact in collision.contacts)
{
Debug.Log("Hit!");
// Visualize the contact point
Debug.DrawRay(contact.point, contact.normal, Color.white);
Ray newRay = new Ray(contact.point, contact.normal);
HandleInput(newRay);
}
}
< /code>
У меня были проблемы с OncollisionEnter, потому что он не будет продолжать должным образом обнаружение столкновений, когда мяч катился. Я переключился, чтобы оставаться в надежде изменить векторы, когда мяч прокатился, вместо одной точки он сработал немного лучше. />https://catlikecoding.com/unity/tutoria ... formation/
Проблемы, которые у меня есть, являются первыми, контактная точка движется слишком медленно, когда мяч катится, что приводит к неправильно расположенным депрессиям. Весенняя физика слишком медленная, чтобы реагировать, и увеличение скорости приводит к полноценной физике сетки полностью развалиться. Во -вторых, мяч колеблется выше контактной точки, потому что коллайдер все еще не движется, это позже вызовет серьезные проблемы с моей игрой.
Я думаю, что я спрашиваю, есть ли какие -либо альтернативы этому подходу, или если с этим в порядке, и я просто подхожу к этому неправильно? Я читал, что Unity не поставляется со стандартной физикой мягкой тела, но это функция, которую я никогда не смогу получить правильно просто потому, что по умолчанию его нет, или я просто смотрю в неправильные места? Я постараюсь включить все это, так как это довольно толстое, и я чувствую, что описать это было бы недостаточным. < /p>
Запуск - мой фактический деформатор сетки. В коде используется округлый куб, который строится с кодом, который я поместил в конце этого, поэтому у меня возникают проблемы. Каждое вершины закодированы в цикле, чтобы быть отступаемым на основе расстояния от точки столкновения. Первоначально он был из лучей, нарисованного в место, которое вы нажимаете с камеры, я отрегулировал его, чтобы вместо этого нарисовать луч с точки контакта с объектом. Похоже, что он работает в правильном месте, по крайней мере, просто не сразу же и остается в покое дольше, чем это должно. < /P>
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(MeshFilter))]
public class MeshDeformer : MonoBehaviour
{
Mesh deformingMesh;
Vector3[] originalVertices, displacedVertices, vertexVelocities;
public float forceOffset = 0.1f;
public float springForce = 20f;
public float damping = 5f;
float uniformScale = 1f;
void Start()
{
deformingMesh = GetComponent().mesh;
originalVertices = deformingMesh.vertices;
displacedVertices = new Vector3[originalVertices.Length];
vertexVelocities = new Vector3[originalVertices.Length];
for (int i = 0; i < originalVertices.Length; i++)
{
displacedVertices = originalVertices;
}
}
public void AddDeformingForce(Vector3 point, float force)
{
Debug.Log("Deformer called with: " + point + " point");
point = transform.InverseTransformPoint(point);
for (int i = 0; i < displacedVertices.Length; i++)
{
AddForceToVertex(i, point, force);
}
}
void AddForceToVertex(int i, Vector3 point, float force)
{
Vector3 pointToVertex = displacedVertices - point;
pointToVertex *= uniformScale;
float attenuatedForce = force / (1f + pointToVertex.sqrMagnitude);
float velocity = attenuatedForce * Time.deltaTime;
vertexVelocities += pointToVertex.normalized * velocity;
}
void Update()
{
uniformScale = transform.localScale.x;
for (int i = 0; i < displacedVertices.Length; i++)
{
UpdateVertex(i);
}
deformingMesh.vertices = displacedVertices;
deformingMesh.RecalculateNormals();
}
void UpdateVertex(int i)
{
Vector3 velocity = vertexVelocities;
Vector3 displacement = displacedVertices - originalVertices;
displacement *= uniformScale;
velocity -= displacement * springForce * Time.deltaTime;
velocity *= 1f - damping * Time.deltaTime;
vertexVelocities = velocity;
displacedVertices += velocity * (Time.deltaTime / uniformScale);
}
}
< /code>
Не уверен, поможет ли это, но вот кодирование сферы, если это изменит ситуацию. < /p>
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
public class CubeSphere : MonoBehaviour
{
public int gridSize;
public float radius = 1f;
private Mesh mesh;
private Vector3[] vertices;
private Vector3[] normals;
private Color32[] cubeUV;
private void Awake()
{
Generate();
}
private void Generate()
{
GetComponent().mesh = mesh = new Mesh();
mesh.name = "Procedural Cube";
CreateVertices();
CreateTriangles();
CreateColliders();
}
private void CreateVertices()
{
int cornerVertices = 8;
int edgeVertices = (gridSize + gridSize + gridSize - 3) * 4;
int faceVertices = (
(gridSize - 1) * (gridSize - 1) +
(gridSize - 1) * (gridSize - 1) +
(gridSize - 1) * (gridSize - 1)) * 2;
vertices = new Vector3[cornerVertices + edgeVertices + faceVertices];
normals = new Vector3[vertices.Length];
cubeUV = new Color32[vertices.Length];
int v = 0;
for (int y = 0; y
Теперь, когда некоторые из вас могут увидеть числа из смещения, демпфирования и масштаба, и такие не совсем правильно. Я редактировал их в попытке заставить вершины ускорить их движение. Однако из -за пружины влияют на то, что она происходит, когда они движутся слишком быстро, чтобы заставить его деформироваться быстрее, чтобы соответствовать фактической точке контакта, когда шар катится, это заставляет его подпрыгивать повсюду. Изначально демпфирование было предназначено для того, чтобы остановить это, однако оно делает до такой степени, что оно снова замедляет его. < /p>
Другая проблема заключается в том, что, если мяч стоит неподвижно, деформация возвращается к нормальной жизни, даже когда он контакт с землей. Я подумал о том, чтобы добавить заявление о проверке для существующего контакта, но беспокоился о том, что дифференциация между объектами для поддержания формы приведет к увеличению сложности, которая, в конце концов, не будет работать в любом случае. < /p>
Наконец, фактический коллайдер не меняется с деформацией. Поскольку указания вершин несколько основаны на месте коллайдера, я не уверен, как решить эту проблему. Следовательно, по дилемме, я не уверен, стоит ли полностью отказаться от этой техники, или есть решение, которое я могу принять, чтобы приблизиться к этому.
Подробнее здесь: https://stackoverflow.com/questions/566 ... -on-a-ball
Какие методы я могу использовать для мягкой физики тела на шаре ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Segfault при вызове getWorldTransform на btRigidBody в движке физики пуль
Anonymous » » в форуме C++ - 0 Ответы
- 32 Просмотры
-
Последнее сообщение Anonymous
-
-
-
HAAR Cascade Detector верхней части тела не работает на половине тела (талия вверх) фото?
Anonymous » » в форуме Python - 0 Ответы
- 0 Просмотры
-
Последнее сообщение Anonymous
-