仪表盘
Vettura 有两种仪表,一辆车可以只用一种,也可以两种一起用:
| 指针表 | 屏幕 | |
|---|---|---|
| 是什么 | 模型里的部件,指针跟着骨骼转 | 贴在驾驶室里的一块画布,每帧由 Vettura 绘制 |
| 适合 | 机械仪表 | 液晶屏、数字车速、挡位、时钟、格子式油量表 |
| 怎么做 | Blender 里建,gauges 填量程 | screens 写画面,可选 fonts 字体 |
指针表
1. 建模
都放在 <名字>_cab 集合里。
- 建表盘,部件名以
_dial结尾,例如body_speedo_dial。刻度可以画在贴图上,也可以建成几何。 - 在指针的转轴上放一个空物体,名字用下表的骨骼名。
- 建指针,部件名是
<骨骼名>_needle(例如speedo_needle),父级设成这个空物体。
| 骨骼 | 读数 | 单位 |
|---|---|---|
speedo | 车速 | km/h |
tach | 转速 | 转/分 |
fuel_gauge | 油量 | 0 到 1 |
temp_gauge | 水温 | °C |
用不到的表不用建,比如没有转速表的车就不要 tach。
_dial 和 _needle 部件在通电时发光。
2. 指针要摆在最低读数
模型里指针摆在哪,那里就是最低读数。 游戏从这个位置开始顺时针转(从驾驶员方向看),转过的角度是:
(读数 − min) ÷ (max − min) × sweep所以要把指针摆在表盘的 0 刻度上,不是摆成朝上。一个从左下走到右下、270° 的车速表,指针就摆在左下角。
指针绕车身的前后方向转(Blender 的 Y 轴),不是绕表盘的法线。表盘向后倾斜时,指针尖转到上方可能会碰到表盘,这时把指针的平面做成竖直的,并离表盘远一点(几毫米)。倾斜很大的表盘用下面的屏幕更合适。
3. 填量程
在 vehicles/<名字>.json 里:
"gauges": {
"speedo": {"min": 0, "max": 160, "sweep": 240},
"tach": {"min": 0, "max": 7000, "sweep": 240},
"fuel": {"min": 0, "max": 1, "sweep": 90},
"temp": {"min": 40, "max": 120, "sweep": 90}
}min、max:表盘两端的读数,单位见上表。sweep:指针从min转到max的角度(度)。量一下表盘两端刻度的夹角。- 超过
max时指针最多再走 2%,不会一直转下去。 - 没写的表用 T15 的值:转速 0–5000 和车速 0–180 走 270°,油量 0–1 和水温 40–120 走 120°。
车速永远按 km/h 算。刻度是英里的表,要把 max 换算成 km/h:100 mph 写 161。
屏幕
屏幕是一块平面画布,有自己的像素坐标(x 向右,y 向下)。只在通电时显示,亮度不受环境影响。
1. 量位置
画布的位置用三个角表示:左上 tl、右上 tr、左下 bl(从驾驶员方向看),单位是米,模型坐标。
在 Blender 里选中屏幕的角点,Shift+S 选「Cursor to Selected」(游标 → 选中项),按 N 在侧栏读 3D 游标的 (x, y, z),填 [x, z, -y]。
Vettura 把画布往驾驶员方向抬 1.5 mm,所以屏幕面贴在模型的面上就行。角的顺序错了,画面会镜像或者上下颠倒。
2. 写画面
"screens": [
{
"corners": {"tl": [-0.50, 0.84, -0.74], "tr": [-0.22, 0.84, -0.74], "bl": [-0.50, 0.74, -0.73]},
"size": [1200, 440],
"background": "mypack:textures/screen/main.png",
"elements": [
{"type": "needle", "value": "rpm", "pivot": [600, 240], "from": 0, "to": 7000, "angles": [240, 480],
"radius": [110, 180], "width": [8, 6], "color": "#D12C20"},
{"type": "text", "value": "speed", "at": [600, 240], "size": 60, "align": "center", "font": "digits"},
{"type": "text", "value": "gear", "at": [600, 300], "size": 42, "align": "center", "font": "digits"},
{"type": "cells", "value": "fuel", "count": 8, "at": [900, 200], "step": [25, 0], "cell": [11, 6], "on": "#FFFFFF", "off": "#2A2A2A"},
{"type": "image", "image": "mypack:textures/screen/high_beam.png", "at": [60, 40], "size": [48, 48], "when": "high_beam"}
]
}
]size 是画布的像素尺寸,所有元素的坐标都按它算,和贴图实际大小无关。background 可选,拉伸铺满画布。一辆车可以有多块屏幕。
元素:
type | 字段 | 说明 |
|---|---|---|
needle | value pivot from to angles radius width color | 指针。读数 from 时角度是 angles[0],读数 to 时是 angles[1]。角度按钟表算:0 朝上,顺时针,可以超过 360。radius 是指针根部和尖端离转轴的距离,width 是根部和尖端的宽度,默认 [6, 4] |
text | value at size align color font | 文字。at 是这一行的左端、中点或右端(看 align:left center right),高度方向在行中间。size 默认 32。不写 font 用 Minecraft 的字体 |
cells | value count at step cell on off | 一排格子。step 是相邻格子的间距 [x, y],cell 是格子的宽高,亮到读数的比例 |
image | image at size when | 图片。不写 when 一直显示 |
读数 value:
| 读数 | 内容 | 能用在 |
|---|---|---|
rpm | 转速 | needle text cells(占断油转速的比例) |
speed | 车速,按玩家设置的单位 | needle text |
speed_kmh speed_mph | 固定单位的车速 | needle text |
fuel | 油量 0 到 1 | needle cells |
coolant | 水温 °C | needle text cells(40–120 °C 的比例) |
air | 车外气温 °C | needle text |
gear | 挡位:R N 1…,自动挡 D3 M3 | text |
clock | 世界时间 hh:mm | text |
when: low_fuel(油量低于 12%)、high_beam(远光)、headlights(大灯)。写别的名字,这张图永远不显示。
3. 字体(可选)
液晶数字用自己的位图字体才好看。把字符排在一张图上,写进 fonts,再在 text 元素的 font 里写这个名字:
"fonts": {
"digits": {
"image": "mypack:textures/screen/digits.png",
"size": [512, 256],
"lineHeight": 96,
"glyphs": {
"0": [0, 0, 48, 72, 52, 12, 0],
"1": [52, 0, 48, 72, 52, 12, 0],
" ": [0, 0, 0, 0, 26, 0, 0]
}
}
}size:字体图的像素尺寸。lineHeight:一行的高度。text的size等于它时按 1:1 画。glyphs每个字符七个数:在图里的x, y, 宽, 高,画完往右走多少(advance),字符离行顶多远(yOffset),离笔尖多远(xOffset)。- 没有列出的字符直接跳过,所以
gear、clock用到的R N D M :都要写上。
图片放在 assets/<车包 id>/textures/,比如 textures/screen/,ID 写 <车包 id>:textures/screen/main.png,要带 .png。
检查
gauges、screens、fonts里拼错的字段名不会报错,只会用默认值或者不显示,写完对着上面的表看一遍。元素的type写错、颜色不是#rrggbb这类错误会报出来。- 用测试页的自动截图,看
driver_running这张:屏幕在通电时才显示,这张发动机是开着的。 - 进游戏开一圈:
- 熄火时指针停在最低读数;
- 用一个已知车速(比如限速的挡位)看指针读数和 HUD 的车速对不对;
- 油箱加满,油量表到满刻度;
- 开远光,
high_beam的图亮起来。
- 屏幕画面镜像或颠倒:检查
tl、tr、bl的顺序和换算([x, z, -y])。

