我正在创建一个基于文本的游戏,并尝试实现程序世界生成.
我最初的计划有点随意:每个宇宙都有一个星系的3D阵列,太阳系,然后又随机天体传播.我打算单独生成实际的本地区域,但我不确定它是否可以像我一样完成任务.
Each universe is a Galaxy[10][10][10] (arbitrary number at the moment),
each galaxy is a randomly sized SolarSystem[50-150][50-150][50-150],
each SolarSystem is a randomly sized CelestialBody[5-20][5-20][5-20].
Run Code Online (Sandbox Code Playgroud)
然后将所有这些写出到数据文件中以便稍后读取.
现在看一下,如果我没有弄错的话,这将需要(((ClassSize ^ 3)^ 3)^ 3)字节,即使ClassSize只有4个字节也不可能存储.
我最初的阵列数组的意图是能够有效地将群集组合在一起,更好地帮助识别玩家在宇宙中的位置.
我的问题是:如何更有效地创造这样规模的世界?
我的代码创建了一个包含许多顶点的网格,然后在顶点着色器中用高度随机噪声值替换它们.四处走动
glTranslated(-camera.x, -camera.y, -camera.z);
Run Code Online (Sandbox Code Playgroud)
工作正常,但这意味着你可以直到网格的边缘.
我想过将相机位置发送到着色器,并让整个位移被它偏移.因此最终的顶点着色器代码:
uniform vec3 camera_position;
varying vec4 position;
void main()
{
vec3 tmp;
tmp = gl_Vertex.xyz;
tmp -= camera_position;
gl_Vertex.y = snoise(tmp.xz / NOISE_FREQUENCY) * NOISE_SCALING;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
position = gl_Position;
}
Run Code Online (Sandbox Code Playgroud)
编辑:我修复了一个缺陷,顶点本身不应该水平移位.
但是出于某种原因,当我运行它并改变相机位置时,屏幕会闪烁,但没有任何动作.顶点被噪声值正确移位,着色和一切都有效,但位移不会移动.
作为参考,这里是git存储库:https://github.com/Orpheon/Synthworld
我究竟做错了什么?
PS:"闪烁"是错误的.这就好像在某些位置它不会绘制任何东西,而其他位置则从位置0绘制正常场景,因此如果我在不停止的情况下移动它会闪烁.我可以在它保持黑色的地方停留,或者在它保持正常的地方停留.
我一直在努力实现Simplex Noise大约一个月,我确实理解使用Simplices来减少所需的计算量以及渐变侧的安全功率.然而,将其实现为任何语言,似乎都是不可能的任务.
在我找到的每一个,每一个,每个代码中,我读到的资源,无处不在,代码似乎都有一个G和一个P表.从一些谷歌搜索和询问周围我了解到他们是一个排列和一个渐变表.他们在做什么?我们为什么需要它们?
我目前的想法是排列表只包含随机值,因此不必在运行时计算它们.
例子:
我正在开发一个项目,该项目通过程序生成一个可以从远处看到的可航行“行星”(即:没有任何可见的“地形”/高度差异。这只会显示水和陆地)或特写(从一个人的观点,而不是“航天器”的观点,即:实际上看到山丘和山谷的高度差异)。为此,我想知道我是否应该使用 2D 或 3D 噪声,因为我在各种网站上都看到过。我还想知道我应该使用单工噪声还是柏林噪声。我知道用途,但加载时间差异会那么严重还是我应该坚持使用 Perlin 噪声?提前致谢。另外,不太重要的是,我将如何将输出实现到 JavaFX 中?
我想不出一个好方法,如果可能的话,我会感激一些帮助!
我担心我没有任何代码可以发布,因为我没有那么远.
我需要从0-999范围内的3个(或可能更多)参数生成一系列值.
对于给定的输入,该值必须始终相同,但在上边界和下边界之间具有公平分布,以便看起来是随机的.
例如:
function (1, 1, 1) = 423
function (1, 1, 2) = 716
function (1, 2, 1) = 112
Run Code Online (Sandbox Code Playgroud)
这些必须合理地快速生成,我的意思是我应该能够在网页加载期间生成100-200而没有明显的延迟.
该方法必须可以在C#中执行,但也可以在JavaScript中执行,否则我可能会使用CRC32或MD5哈希算法.
如果有帮助,这将用作程序生成例程的一部分.
我以前曾经问过这个问题,但我认为我的解释质量很差让我失望.
如果措辞严厉,我道歉.如果是的话,请告诉我,我会尝试进一步解释.
非常感谢您的帮助.
我的目标是创建一个粒子系统,其中涉及每个粒子(顶点)的程序生成纹理,但我发现很难创建这样的粒子系统的原型,它在Canvas和WebGL渲染器下都可以使用three.js
我想要实现的标准:
目前这是否可以使用three.js?我错过了一些功能吗?
//create a texture generation function
function simpleTexture() {
// generate canvas
var canvas = document.createElement('canvas');
canvas.width = 100;
canvas.height = 100;
// get context
var context = canvas.getContext('2d');
// circle texture
context.beginPath();
context.arc(50, 50, 50, 0, Math.PI*2, true);
context.closePath();
context.fillStyle = "red";
context.fill();
// get texture
texture = new THREE.Texture(
canvas
);
texture.needsUpdate = true;
return texture;
}
//then use it like following...
var material = new THREE.ParticleBasicMaterial({
color: 0xffffff,
size: …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用three.js创建一个程序生成的城市,主要由建筑物组成.要求是,当点击建筑物(用鼠标)时,应显示有关该建筑物的信息(例如名称,位置等) - 例如,作为悬停在该建筑物旁边的文本框.
我试图查看three.js网格对象(代表建筑物)是否具有可以存储此信息的任何"数据"属性.它没有.
知道如何实现这个功能吗?TIA.