我试图与程序生成相处,我绝对不是团结的专业人士,但我遵循这个指南:点击 并得到一些结果.现在我有两个问题,我有一些基本的想法如何解决它们,但我想听听其他一些意见.
(我已经在Unity答案中发布了这个问题,但是我根本没有回复,如果有一些遗漏的信息或者几句话无法解释,请告诉我或者提供一些如何查找这些信息的建议)
主要问题是:块之间的差距:
如果我会变焦,它们有点消失,但纹理仍然不合适而且非常显着.
第二个,你可以看到我在地面上有红色问题(我真的不知道怎么称呼它).我曾尝试使用指南中的材料,但效果相同.
此外,Perlin Noise(我知道我可以使用Diamond square或simplex)是伪随机算法,所以它会为相同的输入参数返回相同的值,所以它是否意味着我的块总是相同的?
我的代码(我正在使用指南中的LibNoise库):
void Awake()
{
var settings = new TerrainChunkSettings(129, 129, 100, 40, FlatTexture, SteepTexture, TerrainMaterial);
var noiseProvider = new NoiseProvider();
for (var i = 0; i < 4; i++)
for (var j = 0; j < 4; j++)
new TerrainChunk(settings, noiseProvider, i, j).CreateTerrain();
}
public class TerrainChunkSettings
{
public int HeightmapResolution { get; private set; }
public int AlphamapResolution { get; private set; }
public int Length { get; private …Run Code Online (Sandbox Code Playgroud) 作为一个学习项目,我尝试使用 HTML5 画布重新创建 Tiny Wings 中程序生成的山丘。我的目标是生成像这张图片中的山一样的纹理:

到目前为止,我已经生成了一个无缝重复纹理。它看起来有点像这样:

正如您所看到的,这只是其中的一部分,但是在《Tiny Wings》中,正弦曲线图案通常会旋转一定角度。我的问题是:是否可以采用无缝重复的图案,旋转它,然后将其剪裁为矩形,并且仍然具有无缝重复的图案?
我最初认为这是微不足道的,任何剪辑到其原始尺寸的旋转重复图案仍然会重复。然而,我的调查使我相信事实并非如此。
如果我所描述的不可能,我将如何使用我生成的图像的旋转版本作为形状的图案/填充?到目前为止,我能想到的唯一解决方案是使用画布剪辑区域。还有其他方法可以实现此目的吗?
相关问题:
textures image-processing procedural-generation html5-canvas
我想实现一个程序生成的地形.经过深入研究后,我得出一个结论,它应该采用梯度(相干)噪声生成算法之一,例如Perlin噪声算法.但是,我不希望这一代完全随机.我想应用一些限制(比如应该是山脉,或者应该是低地等).
题:
例如,我有一条代表一些景观元素的曲线.曲线是一系列点.
我试图找到一些关于如何使用Unreal 4 ProceduralMeshComponents通过代码实现功能的示例或文档.网站上这些类的文档非常稀疏,只提供了它们如何运作的最详细信息:
https://docs.unrealengine.com/latest/INT/BlueprintAPI/Components/ProceduralMesh/index.html
我知道,我知道,他们已经接触过蓝图编辑器,所以我知道我可以在引擎本身使用它们.但是,我想了解流程的确切细节,这意味着我需要通过代码在项目中实现这一点.
此外,我觉得仅通过Blueprint节点使用这些组件限制了使用此强大功能可以完成的工作的范围.
我还搜索了任何示例(在网上或论坛上),但找不到任何不涉及以某种方式使用蓝图的内容.另一个问题是这个功能是最近才引入的,在此之前,Rama(一个出色的虚幻用户)提出了一个允许程序网格生成的类似API.但是现在它已被弃用,并且有许多示例引用该版本.
不要误解我的意思,我不是在这里讨论蓝图.我喜欢这个工具并认为它们是Unreal 4中最好的部分之一.但是出于我的目的,我要求从头到尾完全暴露我的过程.
我将非常感谢您可以共享任何实现Unreal Procedural Mesh类的资源或示例,完全通过代码实现某些效果.
有没有一种方法或算法可以自动指定应该如何连接顶点列表?
例如,假设我有这个(为简单起见,以2D表示):
*(0,0) *(2,0)
*(-1,-1) *(1,-1)
Run Code Online (Sandbox Code Playgroud)
所以我按(-1,-1),(0,0),(1,-1),(2,0)的顺序添加顶点,然后将三角形0、1,2和2,1,3,这将生成一个包含两个三角形的网格。
但是,随着顶点数量的增加,定义三角形的过程将变得更加乏味,除非我当然要以某种排序的顺序添加这些顶点,以便我可以跟踪自己是哪个三角形,并且每个都添加一个偏移量时间(我不想做)。
我要去的地方是这个(为简单起见,再次以2D表示):我想定义一个数组,说:
[0,0,1,0,1,0]
[0,0,0,0,0,0]
[0,1,0,1,0,0]
它表示xy平面,并且该数组中的点是顶点(1)或不包含任何点(0)。因此,array [0,0]将为x = 0,y = 0(无),而array [2,1](一个顶点)将为x = 1,y = 2。然后,我想使用它生成一个网格。
这可能吗?任何帮助,将不胜感激。
谢谢
编辑:我知道有一个三角脚本,但它仅适用于2D。
我一直在尝试创建一个广义的渐变噪声生成器(它不使用散列方法来获得渐变).代码如下:
class GradientNoise {
std::uint64_t m_seed;
std::uniform_int_distribution<std::uint8_t> distribution;
const std::array<glm::vec2, 4> vector_choice = {glm::vec2(1.0, 1.0), glm::vec2(-1.0, 1.0), glm::vec2(1.0, -1.0),
glm::vec2(-1.0, -1.0)};
public:
GradientNoise(uint64_t seed) {
m_seed = seed;
distribution = std::uniform_int_distribution<std::uint8_t>(0, 3);
}
// 0 -> 1
// just passes the value through, origionally was perlin noise activation
double nonLinearActivationFunction(double value) {
//return value * value * value * (value * (value * 6.0 - 15.0) + 10.0);
return value;
}
// 0 -> 1
//cosine interpolation
double interpolate(double a, …Run Code Online (Sandbox Code Playgroud) 我正在研究体素地形生成器。一切都很好,我有生物群落,街区等。
让我感到震惊的是我团结一致的项目速度。如果我在主线程上运行所有程序,则只能加载并渲染1到2个块,而不会降至70fps以下。这主要是因为块中的每个块都必须检查其邻居以定义其块侧可见性。一个块有6个邻居,一个块有16个块。这很快就进行了很多检查。
我读过《我的世界》是单线程的,但我很难相信,因为它的块加载速度非常快并且没有fps下降。
我的解决方案是在另一个线程上运行块的块邻居的检查。这将大大提高我的fps和我的块加载速度。这是正确的方法吗?我不想使用线程,因为我的代码未优化。这就像将灰尘推到地毯下面。
谢谢阅读
编辑:检查邻居的代码
//Block provides its mesh information
//Check for solidity of adjacent blocks
public virtual MeshData CreateBlockData(Chunk chunk, int x, int y, int z, MeshData meshData)
{
//Set this to true to turn on collider creation shaped like the chunks
meshData.useRenderDataForCol = true;
if (!chunk.GetBlock(x, y + 1, z).IsSolid(Direction.down))
{
meshData = FaceDataUp(chunk, x, y, z, meshData);
}
if (!chunk.GetBlock(x, y - 1, z).IsSolid(Direction.up))
{
meshData = FaceDataDown(chunk, x, y, z, meshData);
}
if (!chunk.GetBlock(x, y, …Run Code Online (Sandbox Code Playgroud) c# multithreading procedural-generation unity-game-engine minecraft
我一直在尝试使用噪声贴图生成 3D Minecraft 世界,但是无论我如何重叠声音,我都无法获得同时具有平坦区域和山区的噪声贴图。
到目前为止,我尝试重叠不同的噪声贴图,结果各不相同,我最好的结果看起来像这样:https : //imgur.com/0N2x5Ck.png(抱歉,我没把它嵌入这里)
看起来“还可以”,但越靠近,您就越能看到有 2 种不同的噪声波,而且过渡非常粗糙。而整个世界,就是这样的地形,没有什么明显的变化。
我不确定我需要改变噪音的哪个方面。我试过调整音阶、频率,通常只是用我能想到的任何东西来破解它,包括:
到目前为止,我所做的任何事情都没有失败,看起来像培养皿(https://imgur.com/HgNyXUu.png)
重申一下,我正在尝试获得最终的噪声图,其中包括:
都在同一张地图上,很顺利。我该怎么做?
更新:Minecraft 的内置 SimplexOctaveGenerator 似乎没有正确生成八度音程。我用我找到的生成器库(https://github.com/Auburns/FastNoise/)替换了它。八度现在按预期工作,我不再有培养皿的外观,而且我已经获得了一些平坦的陆地和深海。现在所需要的只是山地地形。( https://i.imgur.com/mKIpoaU.png )
我到处搜索,但没有参考。我想将这个着色器从 shadertoy 用于我的 libgdx 项目,所以我尝试首先从以下位置导入简单的着色器:https ://www.shadertoy.com/view/XsffRs
我像这样修改了它,但没有成功:
/*
* Original shader from: https://www.shadertoy.com/view/XsffRs
*/
#ifdef GL_ES
precision mediump float;
#endif
uniform float time;
uniform vec2 resolution;
// shadertoy emulation
#define iTime time
#define iResolution resolution
// --------[ Original ShaderToy begins here ]---------- //
#define TAU 6.28318531
float C,S;
mat2 rot(float a){
return mat2(C=cos(a),S=sin(a),-S,C);
}
float map(vec3 p) {
p.yz*=rot(p.z*(.03*sin(iTime*3.)));
p.xz*=rot(p.z*(.03*cos(iTime*3.)));
float m=TAU/6.,
l=length(p.xy),
a=mod(atan(p.y,p.x)-p.z*.5+iTime*5.,m)-.5*m;
return length(vec2(a*l,l-2.))-.8;
}
void main(void)
{
vec2 uv = gl_FragCoord.xy / iResolution.xy;
uv-=.5; …Run Code Online (Sandbox Code Playgroud)