网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
08月02日漏签0天
codea吧 关注:924贴子:10,894
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 6回复贴,共1页
<<返回codea吧
>0< 加载中...

【BK】Codea Noise噪声 扩展类

  • 只看楼主
  • 收藏

  • 回复
  • 地丶布鲁
  • 声名远扬
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
Codea的noise函数可以生成一系列的随机数(噪声),这个在做游戏的随机地图什么的是十分有用的~
不过codea的noise只有一层噪声,在做地图是时还是显的得不够自然
于是我做了个noise扩展类,这个可以生成更自然的柏林噪声,还有一系列的操作噪声的函数


  • 地丶布鲁
  • 声名远扬
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
--# Main
supportedOrientations(LANDSCAPE_ANY)
function setup()
backingMode(RETAINED)
baseScale,octaveCount,persistance = 0.1,6,0.25
size = 256
xb,yb = 0,0
tileSize = WIDTH / size
nm = NoiseMap(10)
noises = {}
parameter.number("baseScale", 0.02, 0.8, 0.05, setScale)
parameter.integer("octaveCount",1,10,6,setScale)
parameter.number("persistance",0.01,1,0.25,setScale)
parameter.number("noiseSpeed", -10, 10, 0)
parameter.action("update",moveNoise)
parameter.watch([[xb.." "..yb]])
end
function moveNoise()
noises = nm:genPerlinNoise2D(xb,yb,size,size)
-- nm:expend(noises,1.5)
xb = xb + noiseSpeed
yb = yb + noiseSpeed
end
function draw()
background(0, 0, 0, 255)
noStroke()
noSmooth()
for x,column in pairs(noises) do
for y,value in pairs(column) do
fill(value*255)
rect((x-1)*tileSize, (y-1)*tileSize, tileSize, tileSize)
end
end
moveNoise()
end
function setScale()
nm:setScale(baseScale,octaveCount,persistance)
end
--# NoiseMap
NoiseMap = class()
function NoiseMap:init(seed,baseScale,octaveCount,persistance)
local s = seed or math.floor(math.random() * 1938527 - math.random() * 173777)
self.seed = math.abs(s + 123) % 200000
self.xBase = math.floor((self.seed * 37 + 13) / 127) + 1024
self.yBase = math.floor((self.seed * 14 + 31) / 67) + 512
self.zBase = math.floor((self.seed * 31 + 7) / 103) + 2048
print(self.seed,self.xBase,self.yBase,self.zBase)
self:setScale(baseScale,octaveCount,persistance)
end
function NoiseMap:setScale(baseScale,octaveCount,persistance)
if baseScale and baseScale > 1 then baseScale = 1 end
self.baseScale = baseScale or 0.2
self.octaveCount = octaveCount or 4
self.persistance = persistance or 0.25
end
function NoiseMap:genPerlinNoise2D(xBase,yBase,length,width)
local smoothedNoise = {}
for i = 1,octaveCount do
smoothedNoise[i] = self:gen2DNoise(xBase,yBase,length,width,i)
end
local perlinNoise = {}
for x = 1, length do
perlinNoise[x] = {}
for y = 1, width do
perlinNoise[x][y] = 0
end
end
amplitude = 1.0
totalAmplitude = 0.0
for octave = 1,octaveCount do
amplitude = amplitude * persistance
totalAmplitude = totalAmplitude + amplitude
for x = 1, length do
for y = 1, width do
perlinNoise[x][y] = perlinNoise[x][y] + smoothedNoise[octave][x][y] * amplitude
end
end
end
for x = 1, length do
for y = 1, width do
perlinNoise[x][y] = perlinNoise[x][y] / totalAmplitude
end
end
return perlinNoise
end
function NoiseMap:gen2DNoise(xBase,yBase,length,width,octave)
local noises = {}
local xa,ya = self.xBase + xBase,self.yBase + yBase
-- 平滑程度
local noiseScale = self.baseScale * math.pow(2,octave - 1)
for x = 1, length do
noises[x] = {}
for y = 1, width do
noises[x][y] = (noise((x + xa) * noiseScale, (y + ya) * noiseScale) + 1) / 2
end
end
return noises
end
-- 将二维数组转换到一维数组
function NoiseMap:convert2DMapToArray(map)
local array = {}
local length,width = #map,#map[1]
for x = 1, length do
for y = 1, width do
array[(x - 1) * width + y] = map[x][y]
end
end
return array
end
-- 噪声混合,alpha取值0~1,返回混合后的噪声
function NoiseMap:calcMix(map1,map2,alpha)
local noises = {}
local length,width = #map1,#map1[1]
for x = 1, length do
noises[x] = {}
for y = 1, width do
local a,b = map1[x][y],map2[x][y]
noises[x][y] = a + (b - a) * alpha
end
end
end
-- 噪声叠加,将两个噪声相加,返回相加后都的噪声
function NoiseMap:calcAdd(map1,map2)
local noises = {}
local length,width = #map1,#map1[1]
for x = 1, length do
noises[x] = {}
for y = 1, width do
noises[x][y] = map1[x][y] + map2[x][y]
end
end
return noises
end
-- 噪声缩放,s是缩放比例
function NoiseMap:scale(map,s)
local length,width = #map,#map[1]
for x = 1, length do
for y = 1, width do
map[x][y] = map[x][y] * s
end
end
end
-- 分离噪声,极值化,用来生成山峰
function NoiseMap:peak(map,least)
local length,width = #map,#map[1]
for x = 1, length do
for y = 1, width do
if map[x][y] < least then
map[x][y] = 0
end
end
end
end
-- 噪声自增加
function NoiseMap:add(map,a)
local length,width = #map,#map[1]
for x = 1, length do
for y = 1, width do
map[x][y] = map[x][y] + a
end
end
end
-- 复制噪声
function NoiseMap:clone(map)
local noises = {}
local length,width = #map,#map[1]
for x = 1, length do
noises[x] = {}
for y = 1, width do
noises[x][y] = map[x][y]
end
end
return noises
end
-- 噪声扩张,s为扩张系数
function NoiseMap:expend(map,s)
local length,width = #map,#map[1]
local c = 0.5
for x = 1, length do
for y = 1, width do
map[x][y] = map[x][y] + (map[x][y] - c) * s
end
end
end
function NoiseMap:addWithFilter(map,a,filter)
local length,width = #map,#map[1]
for x = 1, length do
for y = 1, width do
if map[x][y] > filter then
map[x][y] = map[x][y] + a
end
end
end
end


2025-08-02 00:43:11
广告
不感兴趣
开通SVIP免广告
  • cbn无悔
  • 闻名一方
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
拢


  • CF万家好
  • 闻名一方
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
虽然不明觉厉,但还是要顶


  • 地丶布鲁
  • 声名远扬
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
更新!加入3d噪声生成和2个新处理函数


  • 地丶布鲁
  • 声名远扬
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
--# Main
supportedOrientations(LANDSCAPE_ANY)
function setup()
backingMode(RETAINED)
baseScale,octaveCount,persistance = 0.1,6,0.25
size = 96
xb,yb,zb = 0,0,0
tileSize = WIDTH / size
nm = NoiseMap(0)
parameter.number("baseScale", 0.01, 0.8, 0.05, setScale)
parameter.integer("octaveCount",1,10,6,setScale)
parameter.number("persistance",0.01,1,0.25,setScale)
parameter.integer("noiseSpeed", -10, 10, 0)
parameter.integer("z", 1, 32, 1)
parameter.action("update",moveNoise)
parameter.watch([[xb.." "..yb]])
parameter.watch([[min.." "..max]])
moveNoise()
end
function moveNoise()
min = 1
max = 0
ls = true
-- noises1 = nm:genPerlinNoise3D(xb,yb,zb,size,size,32)
noises1 = nm:genPerlinNoise2D(xb,yb,size,size)
-- nm:clamp2D(noises1,0.3,0.7)
-- nm:expend2D(noises1,1.2)
xb = xb + noiseSpeed
yb = yb + noiseSpeed
-- zb = zb + noiseSpeed
end
function draw()
moveNoise()
background(0, 0, 0, 255)
noStroke()
noSmooth()
for x,column in pairs(noises1) do
for y,value in pairs(column) do
if ls == true then
if value < min then min = value end
if value > max then max = value end
end
fill(value*255)
rect((x-1)*tileSize, (y-1)*tileSize, tileSize, tileSize)
end
end
ls = false
end
function setScale()
nm:setScale(baseScale,octaveCount,persistance)
end
--# NoiseMap
NoiseMap = class()
function NoiseMap:init(seed,baseScale,octaveCount,persistance)
local s = seed or math.floor(math.random() * 1938527 - math.random() * 173777)
self.seed = math.abs(s + 123) % 200000
self.xBase = math.floor((self.seed * 37 + 13) / 127) + 4000
self.yBase = math.floor((self.seed * 14 + 31) / 67) + 3000
self.zBase = math.floor((self.seed * 31 + 7) / 103) + 5000
self:setScale(baseScale,octaveCount,persistance)
end
function NoiseMap:setScale(baseScale,octaveCount,persistance)
if baseScale and baseScale > 1 then baseScale = 1 end
self.baseScale = baseScale or 0.2
self.octaveCount = octaveCount or 4
self.persistance = persistance or 0.25
end
function NoiseMap:genPerlinNoise2D(xBase,yBase,length,width)
local smoothedNoise = {}
for i = 1,octaveCount do
smoothedNoise[i] = self:gen2DNoise(xBase,yBase,length,width,i)
end
local perlinNoise = {}
for x = 1, length do
perlinNoise[x] = {}
for y = 1, width do
perlinNoise[x][y] = 0
end
end
amplitude = 1.0
totalAmplitude = 0.0
for octave = 1,octaveCount do
amplitude = amplitude * persistance
totalAmplitude = totalAmplitude + amplitude
for x = 1, length do
for y = 1, width do
perlinNoise[x][y] = perlinNoise[x][y] + smoothedNoise[octave][x][y] * amplitude
end
end
end
for x = 1, length do
for y = 1, width do
perlinNoise[x][y] = perlinNoise[x][y] / totalAmplitude
end
end
return perlinNoise
end
function NoiseMap:gen2DNoise(xBase,yBase,length,width,octave)
local noises = {}
local xa,ya = self.xBase + xBase,self.yBase + yBase
-- 平滑程度
local noiseScale = self.baseScale * math.pow(2,octave - 1)
for x = 1, length do
noises[x] = {}
for y = 1, width do
noises[x][y] = (noise((x + xa) * noiseScale, (y + ya) * noiseScale) + 1) / 2
end
end
return noises
end
function NoiseMap:genPerlinNoise3D(xBase,yBase,zBase,length,height,width)
local smoothedNoise = {}
for i = 1,octaveCount do
smoothedNoise[i] = self:gen3DNoise(xBase,yBase,zBase,length,height,width,i)
end
local perlinNoise = {}
for x = 1, length do
perlinNoise[x] = {}
for y = 1, height do
perlinNoise[x][y] = {}
for z = 1, width do
perlinNoise[x][y][z] = 0
end
end
end
amplitude = 1.0
totalAmplitude = 0.0
for octave = 1,octaveCount do
amplitude = amplitude * persistance
totalAmplitude = totalAmplitude + amplitude
for x = 1, length do
for y = 1, height do
for z = 1, width do
perlinNoise[x][y][z] = perlinNoise[x][y][z] + smoothedNoise[octave][x][y][z] * amplitude
end
end
end
end
for x = 1, length do
for y = 1, height do
for z = 1, width do
perlinNoise[x][y][z] = perlinNoise[x][y][z] / totalAmplitude
end
end
end
return perlinNoise
end
function NoiseMap:gen3DNoise(xBase,yBase,zBase,length,height,width,octave)
local noises = {}
local xa,ya,za = self.xBase + xBase,self.yBase + yBase,self.zBase + zBase
-- 平滑程度
local noiseScale = self.baseScale * math.pow(2,octave - 1)
for x = 1, length do
noises[x] = {}
for y = 1, height do
noises[x][y] = {}
for z = 1, width do
noises[x][y][z] = (noise((x + xa) * noiseScale, (y + ya) * noiseScale, (z + za) * noiseScale) + 1) / 2
end
end
end
return noises
end
-- 将二维数组转换到一维数组
function NoiseMap:convert2DMapToArray(map)
local array = {}
local length,width = #map,#map[1]
for x = 1, length do
for y = 1, width do
array[(x - 1) * width + y] = map[x][y]
end
end
return array
end
-- 噪声混合,alpha取值0~1,返回混合后的噪声
function NoiseMap:calcMix2D(map1,map2,alpha)
local noises = {}
local length,width = #map1,#map1[1]
for x = 1, length do
noises[x] = {}
for y = 1, width do
local a,b = map1[x][y],map2[x][y]
noises[x][y] = a + (b - a) * alpha
end
end
end
-- 噪声叠加,将两个噪声相加,返回相加后都的噪声
function NoiseMap:calcAdd2D(map1,map2)
local noises = {}
local length,width = #map1,#map1[1]
for x = 1, length do
noises[x] = {}
for y = 1, width do
noises[x][y] = map1[x][y] + map2[x][y]
end
end
return noises
end
-- 噪声缩放,s是缩放比例
function NoiseMap:scale2D(map,s)
local length,width = #map,#map[1]
for x = 1, length do
for y = 1, width do
map[x][y] = map[x][y] * s
end
end
end
-- 分离噪声,极值化,用来生成山峰
function NoiseMap:peak2D(map,least)
local length,width = #map,#map[1]
for x = 1, length do
for y = 1, width do
if map[x][y] < least then
map[x][y] = 0
end
end
end
end
-- 噪声自增加
function NoiseMap:add2D(map,a)
local length,width = #map,#map[1]
for x = 1, length do
for y = 1, width do
map[x][y] = map[x][y] + a
end
end
end
-- 复制噪声
function NoiseMap:clone2D(map)
local noises = {}
local length,width = #map,#map[1]
for x = 1, length do
noises[x] = {}
for y = 1, width do
noises[x][y] = map[x][y]
end
end
return noises
end
-- 噪声扩张,s为扩张系数
function NoiseMap:expend2D(map,s)
local length,width = #map,#map[1]
local c = 0.5
for x = 1, length do
for y = 1, width do
map[x][y] = map[x][y] + (map[x][y] - c) * s
end
end
end
-- 带过滤的增加噪声
function NoiseMap:addWithFilter2D(map,a,filter)
local length,width = #map,#map[1]
for x = 1, length do
for y = 1, width do
if map[x][y] > filter then
map[x][y] = map[x][y] + a
end
end
end
end
-- 将噪声截取在某个范围(min,max)内
function NoiseMap:clamp2D(map,min,max)
local length,width = #map,#map[1]
for x = 1, length do
for y = 1, width do
if map[x][y] < min then
map[x][y] = min
elseif map[x][y] > max then
map[x][y] = max
end
end
end
end
-- 将噪声截取在标准范围内(0,1)
function NoiseMap:normalClamp2D(map)
self:clamp(map,0,1)
end


  • HexBlues
  • 颇具盛名
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
挖个坟, 最近在研究 terrain , 学习下


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 6回复贴,共1页
<<返回codea吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示