FreeBlues

# 翻译: 星球生成 II

• 译者: FreeBlues

## 已有的几何体

``````for ( int j = 0; j < numRows; ++j )
{
for ( int i = 0; i < numCols; ++i )
{
vertices[  j * width + i ].UV.x = (float)i / (float)(numCols - 1);
vertices[  j * width + i ].UV.y = (float)j / (float)(numRows - 1);
}
}
``````

## 生成高度图

`Libnoise` 是一个可移植的, 开源的, 连贯的噪声生成 `C++` 库. 对我的需求来说, 这一点听起来很不错, 当我在 `Nexus 5 Android` 手机上运行这些代码时, 并且这个库还支持一个 `SetSeed` 函数, 因此它满足了我给定一个种子能够复现相同结果的需求

## 使用简单噪声

`simplexnoise.h` 文件中对我们目前情况有用的函数是 `scaled_octave_noise_3d`, 它允许为三维坐标生成噪声, 充分满足我们沿着星球交点包裹纹理贴图的需求.

``````float scaled_octave_noise_3d( const float octaves,
const float persistence,
const float scale,
const float loBound,
const float hiBound,
const float x,
const float y,
const float z );
``````

``````void CalculateHeight( Vector3& vPosition )
{
// Get the direction vector from the center of the sphere
Vector3 vNormalFromCenter = vPosition;
vNormalFromCenter.Normalize();

// Variables for the noise
static const float HEIGHT_MAX = 24.5f; // Planet Radius is 1,000.
static const float HEIGHT_MIN = -31.0f;
static const float NOISE_PERSISTENCE = 0.6f;
static const float NOISE_OCTAVES = 8.0f;
static const float NOISE_SCALE = 1.0f;

// Generate the noise for the position
float fNoise = scaled_octave_noise_3d( HEIGHT_OCTAVES, HEIGHT_PERSISTENCE, NOISE_SCALE, HEIGHT_MIN, HEIGHT_MAX, vPosition.x, vPosition.y, vPosition.z );

// Keep ocean level as base level
if ( fNoise <= -0.0f )
fNoise = 0.0f;

// Displace the position
vPosition += vNormalFromCenter * fNoise;
}
``````

## 应用一个种子数

``````static const int perm[512] = { ... }
``````

``````// Variables
// perm - SimplexNoise's Permutation table
void set_seed( unsigned int seed )
{
// Set the seed for random generator
srand( seed );

// Set up the random numbers table
for ( int i = 0; i < 256; ++i )
{
// Put each number in once
perm[ i ] = i;
}

// Randomize the random numbers table
for ( int i = 0; i < 256; ++i )
{
// Replace current value with random value from the table
int k = perm[ i ]; // current value

// Random table cell
int j = (int)random( 256 );

// Replace two values
perm[ i ] = perm[ j ];
perm[ j ] = k;

// The table repeats itself so just assign repeating values the same way
perm[ 256 + i ] = perm[ j ];
perm[ 256 + j ] = k;
}
}
``````

## 参考

### FreeBlues

FreeBlues
2016/07/21
44
0

_ | | | | / | / || | _| | |/ | |/| |/ ` | '_ / _____ | |/ / | | || | | () | | | | (| | | | _ _) | <| || ||| _|_/|| ||_,|| ||//||_\_, | ___/ 一、前言 无人深空（NomansSky）是什么：......

2016/08/28
0
0
canvas绘制太阳系

Jeff.Zhong
2017/10/27
0
0
React Conf 2018 专题 —— React Today and Tomorrow PART II 视频中英双语字幕

2018/11/27
0
0
LeetCode 136 Single Number（只出现一次的数字）

nomasp
2016/02/18
0
0

java通过ServerSocket与Socket实现通信

Blueeeeeee

6
0

5
0

16
0

（手机横屏看源码更方便） 注：java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期，但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

18
0
jquery--DOM操作基础

7
0