Grasshopper

algorithmic modeling for Rhino

Hi All,

I want to start a discussion about planet generation for game engines. This will be a rambling opening in attempt to cover some ground. I have written a script that produces a planet at various levels of detail by subdividing a 6 sided cube mesh and projecting its vertices according to a referenced height map. This is one of the standard conventions for building full sizes planets. At the lowest level (0) the mesh planet is made of 6 pieces(each 32x32 resolution). The next level down (1) is made of 24 pieces... 6 divided by 4 = 24. Level (2) is 96 quads etc etc. The script will generate each quad at its sub-division level and compare edge vertices to neighboring quads. It will then make sure any shared vertices are in fact at the same projected vector. This ensures a planet quad with edge vertices that match.

The problems comes in texturing each quad.

If I build the quad as a nurb surface from points I can place the texture easily because each surface UV maps squarely to my texture map (which is also square).

If I build the quad as a mesh I cannot just apply the square texture to the mesh UVs. This is because when you unwrap the UVs from a mesh they will not unwrap like a nurb surface's UVs. Therefore to get the correct mapping I would have to manipulate each UV back to an evenly aligned array (which is 1024 points in a 32x32 resolution UV). Maya and blender have 'relax uv' and 'align UV' functions but they don't do the trick and manual corrections are out of the question. So why not skip the mesh method and use the nurb method?

I did this and there is a trade off. The nurb will accept the material texture I want with no other work on my end but when I export the object as an .obj rhino creates its own mesh to describe the nurb(with various unsatisfactory setting options). This works great up to a point because at some level the interpreted mesh will have vertices that do no match at the edges, ie .. creating visible seams in the mesh. The picture below is the nearly seamless planet at LOD(1) made of 24 quads, each with 32x32 vertice resolution and a 512x512 jpg texture running in Unity3d 5. It works but at close level there are seams. This will be resolved simply by having the next LOD(x) instantiate before getting close enough to see the seam but at core nerd level I want the seamless mesh.

So, I can make the seamless mesh but I can not realistically texture map it. I can also make the nurb surface from points and texture it at the expense of the edge vertices matching. I am at the split in the road but I want to have my cake and eat it too. Thoughts, comments, trolls...?

Thanks for reading =)

Footnote: For you pros I am not using seamless noise across the map I am using grasshopper to sew up my otherwise non perfect edges.

Other programs in the pipeline:

-WorldMachine 2

-Wilbur

-Photoshop

-Unity3d

Views: 1271

Replies to This Discussion

...I can make the seamless mesh but I can not realistically texture map it...

Do you speak C#?

Yeah. direction I should take? Thanks PF!

I'll post here something soon (requires some "cleaning": blame 123 divisions by zero, he he) ... maybe this weekend ... if N46 wins the Assen MotoGP (to boost moral(s)).

I tried the code below but I have't had any breakthroughs yet. 

[Code=CSharp]

using UnityEngine;
using System.Collections;

public class resetMeshUVs : MonoBehaviour {
void Awake() {
Mesh mesh = GetComponent<MeshFilter>().mesh;
Vector3[] vertices = mesh.vertices;
Vector2[] uvs = new Vector2[vertices.Length];
int count = vertices.Length;
for (int i=0; i < uvs.Length; i++) {
uvs[i] = new Vector2((vertices[i]/count).x, (vertices[i]/count).z);
}
mesh.uv = uvs;
}
}

[/Code]

Solved this by building out the seamless meshes and remapping their UVs using Rhino script. 

you sound like oldgrasshopper now =)

RSS

About

Translate

Search

Photos

  • Add Photos
  • View All

Videos

  • Add Videos
  • View All

© 2024   Created by Scott Davidson.   Powered by

Badges  |  Report an Issue  |  Terms of Service