完全指南:岛屿、湖泊与海洋的分类、命名与海岸线管理)
前端图形学3D渲染【免费下载链接】Fantasy-Map-GeneratorWeb application generating interactive and highly customizable maps项目地址https://gitcode.com/gh_mirrors/fa/Fantasy-Map-Generator点击查看免费下载Geographical Features Overview地理特征总览是 Fantasy-Map-GeneratorFMG中集中管理地图上全部地理特征的表格面板高度图heightmap生成的每一个岛屿、湖泊与海洋都以一行记录的形式列出你可以在这里为无名岛屿命名、重新划分湖泊子类型、按面积比较各大陆块或为单个特征设置独立的海岸线形态。读完本文你将掌握特征总览的完整使用流程——包括特征类型/子类型/分组三套标签的语义区别、全部列与筛选器的行为、单特征海岸线覆盖override机制以及这些操作在源码中的底层实现原理。打开方式与整体定位总览面板位于Tools → Features菜单快捷键为ShiftF。快捷键绑定定义在 src/components/hotkeys.ts当shift或altShift且按键码为KeyF时调用Controllers.FeaturesOverview.open()。面板由 src/controllers/features-overview.ts 实现其核心定位是列出高度图产生的每一个特征island / lake / ocean并以表格形式供你修改特征的命名、分类subtype与绘制分组group。它本身不产生也不删除任何地理特征——特征的存在与否完全由高度图决定。注意在customization地图已进入自定义状态模式下面板不会打开见 open() 中的if (customization) return。什么是“特征”feature一个特征feature是由海岸线或地图边界围成的连续区域包括三种类型island岛屿——任何陆地从大陆到仅占一个网格单元的孤岛lake湖泊——被陆地包围的水体ocean海洋——一直延伸到地图边界的水体。特征来自高度图因此无法在此面板中创建或删除。要新增岛屿、淹没一块陆地或将大陆一分为二请使用Tools → Heightmap高度图编辑器。总览面板只改变特征的命名、分类和绘制方式。从源码看特征的识别发生在两个阶段src/generators/features-generator.ts 中的markupGrid()遍历网格单元做连通区域标记markupPack()在打包后的图上再次标记并计算顶点、面积等属性。其中类型判定逻辑为const type land ? island : border ? ocean : lake;即陆地高度 ≥ 20为 island水体且触及地图边界border为 ocean水体且完全被陆地包围为 lake。这段判定出现在 markupGrid() 与 addFeature() 两处二者的判定规则完全一致。类型、子类型与分组三套不同的标签每个特征携带三个标签含义各不相同标签含义可编辑性Typeisland、lake、ocean由地形形状决定不可编辑Subtype类型内部的分类生成器会读取它承载实际语义可在固定集合内更换Group特征被绘制进的 SVG 分组只影响外观、不影响行为湖泊可编辑可自由创建子类型Subtype子类型集合是固定的你可以在集合内换一个但不能自创。固定集合定义于 src/generators/features-generator.ts岛屿continent、island、isle、lake_island湖泊freshwater、salt、dry、sinkhole、frozen、lava海洋ocean、sea、gulf按大小划分同时决定生成名称所围绕的名词子类型承载语义生成器确实会读取它例如不可通航湖泊dry、frozen、lava被定义为不可航行、无港口。定义见NON_NAVIGABLE_LAKE_SUBTYPESfeatures-generator.ts读取见 burgs-generator.ts 中的if (NON_NAVIGABLE_LAKE_SUBTYPES.has(feature.subtype)) continue。isle影响文化与行省的形成如 cultures-generator.ts 中subtype isle P(0.4)的条件以及 provinces-generator.ts 对subtype ! isle的判断。货物与标记的出现位置受若干子类型影响如 goods-generator.ts 中盐的分布条件shore(1) type(salt, dry)。分组Group分组是特征绘制所在的 SVG 分组仅此而已——它决定外观绝不决定行为。两个湖泊可以共享同一子类型却绘制得不同也可以共享同一分组而行为不同。分组是可自由创建的想建多少建多少。岛屿的分组由地理决定sea_island与lake_island取决于岛屿所处位置海洋则不参与分组不被绘制。子类型的自动判定逻辑虽然用户可在固定集合内手动更换子类型但默认值由生成器根据地理与气候自动计算defineGroups()见 features-generator.ts岛屿若前一个特征按网格序是湖泊则为lake_island否则按网格单元数超过CONTINENT_MIN_SIZE总网格数 /10为continent超过ISLAND_MIN_SIZE总网格数 /1000为island其余为isle。湖泊温度低于 -3 为frozen高海拔且极小概率为lava无入流出流且蒸发远超流入为dry极小且特定网格为sinkhole有蒸发无出流为salt否则freshwater。海洋按单元格数量分档为ocean/sea/gulfgetOceanSubtype() 总网格数 /25 为 ocean 总网格数 /1000 为 sea其余为 gulf。表格列详解表格定义于 features-overview.ts 的columns数组各列行为如下Locate靶心图标——缩放定位到该特征。海洋没有轮廓线因此缩放会覆盖其所有网格单元zoomToFeature() 对 ocean 使用oceanCells()取全部单元格坐标计算包围盒。Feature——名称列。岛屿取第一块陆地单元所属文化命名湖泊取一个岸边单元所属文化命名另有10% 概率P(0.1)见 getName()改用英文形容词如Azure。海洋不用文化名而是用形容词或其所处的地图方位Azure、Northern见 getOceanName()80% 概率取形容词否则按重心相对地图中心的位置取名Western / Eastern / Northern / Southern。兼容的旧地图在载入时会自动补齐缺失的名称。输入文字即可改名清空字段则该特征显示为Unnamed。Type——子类型列显示为Freshwater lake、Isle或Sea等subtype下划线替换为空格并首字母大写见 getTypeLabel()。每个特征都可编辑子类型类型本身island/lake/ocean来自高度图不可改变。lake_island以纯文本显示不可改岛屿是否在湖中由地理决定。重新生成世界或重新生成河流时会重新分类所有特征。Group——仅湖泊可编辑下拉选择见 renderGroupCell()。岛屿以文本显示其分组。分组下拉列表来源于Object.keys(styles.lakes.groups)即样式系统中已注册的湖泊分组并保证当前特征的既有分组即使已被移除也仍在选项中。Area——按所选单位显示的面积。触及地图边界的特征所有海洋以及被边界切开的岛屿会延伸出地图之外因此其面积是估算值用~标记假定该特征在全球范围内保持其占地图的比例getCalculatedArea()feature.border ? feature.area / getGlobeCoverage() : feature.area其中getGlobeCoverage options.map.geography.mapSize / 100。悬停数值可查看地图内的实际面积。Coastline多边形图标——仅岛屿和湖泊可用海洋无轮廓。打开 Coastline Editor 并预先选中该特征openCoastlineEditor() 调用Controllers.CoastlineEditor.open(getRowId(element))。Note书图标——编辑该特征的自由文本笔记图例。Edit铅笔图标——仅湖泊可用打开Lake Editor岛屿和海洋没有自己的编辑器。点击列头可排序点击表头的滑块图标可显示/隐藏列initColumnVisibility()。按特征设置海岸线Coastline settings per featureCoastline EditorTools → Coastlines可一次性塑造地图上所有海岸线。其顶部的范围选择器可将作用范围切换为单个岛屿或湖泊在其中做出的第一次修改会让该特征获得专属海岸线设置此后地图全局设置不再影响它。典型用法是让一个大陆拥有峡湾而世界其余部分保持平缓海岸或者让某个湖泊变得风平浪静。表格中的多边形图标会打开编辑器并预选该特征。拥有专属设置的特征在选择器中以•标记featureLabel() 在特征名后追加•。选择器旁的Reset to map settings按钮会删除专属设置使该特征恢复按地图全局设置绘制dropOwnSettings() 中delete selectedFeature.coastline。表格中此类特征的多边形图标以实心显示暗淡的图标表示该特征遵循地图设置features-overview.tsstyle${feature.coastline ? : opacity:.7}。特征被选中时预览显示其真实形状——橙色表示粗糙海岸段、青色表示平缓海岸段并带有对最粗糙段的放大镜重置箭头↺将某个值恢复到地图设置而非默认值。专属设置随地图一起保存。从源码看专属设置存于特征的coastline字段类型为CoastlineSettings见 Feature 接口与 CoastlineSettings 接口applyChange() 中const firstChange !selectedFeature.coastline正是“第一次修改建立专属设置”这一语义的实现。渲染端通过 shoreSettings() 决定某特征使用自己的设置还是全局设置const settings feature.coastline || this.settings同时湖泊海岸会额外乘以lakeSmoothThreshMult的平缓系数。绘制使用 drawFeaturePath() 对单个特征重绘而不触碰其他特征。更改子类型不会重新生成任何内容将淡水湖改为干涸湖dry只是重新贴标签它不会移除岸上的港口、不会移动周围的货物、也不会重算其他任何数据——与其他编辑器行为完全一致。如果需要世界跟上变化请自行重新生成 burgs城镇、routes航线或 goods货物。这一行为在源码中同样清晰子类型修改仅写入feature.subtype字段注释明确写着 no cascade: generators pick it up on the next runchangeSubtype()。生成器只会在下一次运行时读取新值。高亮Highlighting悬停行在地图上描出该特征的轮廓。悬停地图高亮指针所指特征对应的行。海洋不被绘制成形状因此海洋行描出的是其网格单元的边缘——海岸线加上它所触及的地图边界——当一张图上有多个海洋时这样便于区分。实现见 featureHighlightOn()对 ocean 使用getOceanPath()一次性构建缓存于oceanPathsMap 中对岛屿/湖泊使用getFeaturePath()feature_${id}SVG 元素的d属性。行与地图双向联动绑定于 bindRowActions()。筛选器FiltersSearch搜索——匹配名称包含Unnamed、类型与子类型getFilteredFeatures() 中对[name, type, subtype]数组做toLowerCase().includes(search)。Type类型——限定为岛屿、湖泊或海洋。Subtype子类型——选项跟随所选类型类型设为all时提供全部子类型updateSubtypeFilter() 从三个子类型数组拼接得到完整列表。筛选条件在地图打开期间会被记住dialogState.get(dialogId, filters, ...)页脚显示当前显示的特征数与总数以及它们的合计面积renderFeaturesPage()。按钮Refresh刷新——重建表格例如在编辑高度图之后使用。Heightmap——打开Heightmap Editor那里才是真正新增/移除特征的地方features-heightmapControllers.HeightmapEditor.open()。Export导出——将列表中的特征保存为.csv文件。导出格式见 downloadFeaturesData()表头为Id,Name,Type,Subtype,Group,Area (unit),Map area (unit),Cut by border其中Map area是地图内实际面积Cut by border标记特征是否被地图边界切断文件名形如Features_map-name.csv。海洋Oceans海洋拥有子类型Ocean、Sea、Gulf按大小划分但没有分组、没有专属海岸线设置。你可以为海洋命名并添加笔记——当你的世界有具名海域时很有用——但笔记不会在地图悬停时弹出因为海洋没有可悬停的形状。如需查看请从Notes Editor或搜索栏打开。湖泊分组Lake groups新分组在Lake Editor中创建点击地图上的湖泊或使用表格中的铅笔图标选中湖泊点击Group旁的输入分组名。创建后它会在表格的 Group 列对所有湖泊出现并出现在Style Editor的lakes元素下可为其配置专属颜色。分组随地图保存。在 Lake Editor 中移除自定义分组会将其湖泊移回freshwater分组并删除其样式。六个默认分组freshwater、salt、dry、sinkhole、frozen、lava不可移除。从样式系统看分组的绘制通过 src/components/layers.ts 中注册的 SVG 层结构完成#lakes g承载湖泊分组、#coastline g承载岛屿分组其中岛屿分组预设了sea_island与lake_island两个子层layers.ts样式定义位于 src/generators/default-styles.json 的lake_island条目。与高度图编辑的协作机制总览面板与高度图编辑器的关系值得专门说明特征只能在 Heightmap Editor 中增删Tools → Heightmap而总览中的 Refresh 按钮正是为了在高度图编辑后重建表格。为保证用户数据不因重标记而丢失features-generator.ts 提供了captureUserData()/restoreUserData()机制编辑高度图前捕获每个具名/带笔记/带海岸线设置的特征所覆盖的网格单元重标记后将名称、笔记与专属海岸线设置交还给覆盖原区域最多的新特征且只有当新特征与原特征类型一致例如“被抬高成陆地的湖”不会把数据交给覆盖它的岛屿且重叠超过一半时才移交。这套行为由 features-generator.test.ts 中的feature user data across a re-markup测试套件完整验证。实践建议查找无名岛屿按ShiftF打开总览搜索Unnamed用 Locate 图标定位并命名。对比大陆面积点击 Area 列头按面积降序排序默认即为此排序见 columns 中defaultSort: desc注意海洋与被边界切断的岛屿面积带~估算标记。单湖或单岛的海岸风格在总览中用多边形图标直接打开 Coastline Editor 并预选该特征第一个滑块改动即建立专属设置之后地图全局设置不再干扰它。修改子类型后的连锁反应换子类型不会触发任何重新生成若需港口、货物、行省等同步更新请手动重新生成对应的生成器。延伸阅读Coastline Editor——海岸线分形化的全部滑块、预设与预览机制Heightmap Editor——特征的真正增删入口Lake Editor——湖泊分组与湖泊参数编辑features-generator.ts——特征识别、子类型自动判定与命名算法features-overview.ts——总览面板的完整实现features-generator.test.ts——跨重标记的用户数据保留行为测试赞分享前端图形学3D渲染【免费下载链接】Fantasy-Map-GeneratorWeb application generating interactive and highly customizable maps项目地址https://gitcode.com/gh_mirrors/fa/Fantasy-Map-Generator点击查看免费下载相关推荐Fantasy Map Generator 地图装饰Map Embellishments完全指南蚀刻地形、海洋波浪、湖泊涟漪与插图式图标Fantasy Map Generator 地图装饰Map Embellishments完全指南蚀刻地形、海洋波浪、湖泊涟漪与插图式图标 自 v1.153前端图形学3D渲染Fantasy Map Generator 地理要素总览Features Overview与要素数据模型重构指南Fantasy Map Generator 地理要素总览Features Overview与要素数据模型重构指南 本文基于仓库内 features over前端图形学3D渲染Crest-OceanRender 水体系统详解海洋、湖泊与河流的创建与管理Crest OceanRender 水体系统详解海洋、湖泊与河流的创建与管理 前言 Crest OceanRender 是一个强大的水体渲染解决方案它提供了图形学3D渲染游戏开发上一篇OpenCloud 依赖中的高性能 JSON 库json-iterator/go 零成本迁移与原理完全指南下一篇3大核心兼容性修复方案WarcraftHelper技术架构与性能调优实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考