Quero gerar uma pista de corrida tridimensional em torno de um spline que descreve sua forma. Aqui está um vídeo ilustrativo .
A trilha deve ser um túnel sem fim que varre ao longo de uma spline 3D, com alguns obstáculos lançados. Minha melhor idéia até agora foi elevar uma forma de círculo ao longo da spline.
Eu também gostaria de algumas dicas sobre como gerenciar a geometria, ou seja, como criá-la a partir da operação loft, gerenciar seu 'ciclo de vida' em memória, colisão e texturização.
opengl
3d
racing
procedural
Valentin Galea
fonte
fonte
Respostas:
Não sei em que idioma você está trabalhando, mas há um exemplo de extrusão de malha processual para o Unity3D localizado aqui:
http://unity3d.com/support/resources/example-projects/procedural-examples
Tenho certeza de que você pode olhar o código e reformulá-lo para sua situação.
EDIT: Estou trabalhando em um jogo que usa um sistema de trilhos extrudados procedurais como o que você está iniciando, mas está em C # no Unity3d. Darei a você uma visão geral de como eu crio minha extrusão de trilho com base em um caminho de Bezier cúbico. Embora a malha do trilho seja gerada processualmente, ela é baseada no caminho de Bezier que defino antecipadamente em um editor. Seria como um editor de níveis no seu jogo, no meu caso, ele está projetando mesas de pinball. Listado abaixo está um exemplo de como estou fazendo isso:
1.) Construa / encontre e implemente uma classe de caminho de Bezier. Isso fornecerá os dados de origem para sua extrusão de malha. Há um em C # aqui que você pode portar para c ++.
http://forum.unity3d.com/threads/32954-Waypoints-and-constant-variable-speed-problems?p=213942
2.) Depois de criar um caminho de Bezier, os pontos de dados desse caminho são amostrados. Isso pode ser feito através do método Interp na classe fornecida acima. Isso fornecerá uma lista / matriz de pontos Vector3 ao longo do caminho de Bezier.
3.) Crie uma classe auxiliar para converter os dados do caminho do Vector3 Bezier da etapa 2. Nesse caso, eu tenho uma classe simples chamada ExtrudedTrailSection conforme definido abaixo:
4.) Repita os dados de amostra Vector3 e converta-os em uma matriz de ExtrudedTrailSections, fornecendo-os com os dados de amostra e uma matriz base que seria o local raiz da malha extrudada.
Matrix4x4 worldToLocal = rootTransform.worldToLocalMatrix;
6.) Agora você tem uma matriz de Matrix4x4 [] e pode extrudar uma malha, mas primeiro precisamos de uma malha de referência para extrudar. Eu tenho uma classe de utilitário que criará uma face de malha circular que forneceremos ao método de extrusão de malha.
7.) Encontre o centro desses dados:
8.) Agora que temos os dados da borda e do centro de uma malha de face radial, você pode construir um objeto de malha usando seus dados. O vértice final na malha é o ponto central que calculamos. A malha final é apenas uma face que é fornecida ao método de extrusão de malha que forneci como exemplo na classe de extrusão de malha procedural do pacote Unity. Novamente, esse é o meu método e, obviamente, você teria que alimentar esses dados no OpenGL. Se você tem uma biblioteca de utilitários 3d que está usando ou pode escrever sua própria classe de malha, provavelmente funcionaria melhor para gerar sua malha extrudada final, pois esses dados não são realmente necessários para o opengl para renderização. Essa malha de face é usada apenas como referência para a extrusão de malha.
9.) Encontre as arestas externas da malha circular conforme necessário pelo método de extrusão da malha. Novamente, esse código é fornecido no pacote unity.
10.) Alimente todos esses dados no método Mesh Extrusion.
A saída final no meu caso é assim.
Boa sorte, seu jogo parece muito legal! Deixe-me saber se você descobrir isso?
Mandril
fonte