Skip to content

仪表盘 ​

Vettura 有两种仪表,一辆车可以只用一种,也可以两种一起用:

指针表屏幕
是什么模型里的部件,指针跟着骨骼转贴在驾驶室里的一块画布,每帧由 Vettura 绘制
适合机械仪表液晶屏、数字车速、挡位、时钟、格子式油量表
怎么做Blender 里建,gauges 填量程screens 写画面,可选 fonts 字体

指针表 ​

1. 建模 ​

都放在 <名字>_cab 集合里。

  1. 建表盘,部件名以 _dial 结尾,例如 body_speedo_dial。刻度可以画在贴图上,也可以建成几何。
  2. 在指针的转轴上放一个空物体,名字用下表的骨骼名。
  3. 建指针,部件名是 <骨骼名>_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 里:

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. 写画面 ​

json
"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字段说明
needlevalue pivot from to angles radius width color指针。读数 from 时角度是 angles[0],读数 to 时是 angles[1]。角度按钟表算:0 朝上,顺时针,可以超过 360。radius 是指针根部和尖端离转轴的距离,width 是根部和尖端的宽度,默认 [6, 4]
textvalue at size align color font文字。at 是这一行的左端、中点或右端(看 align:left center right),高度方向在行中间。size 默认 32。不写 font 用 Minecraft 的字体
cellsvalue count at step cell on off一排格子。step 是相邻格子的间距 [x, y],cell 是格子的宽高,亮到读数的比例
imageimage at size when图片。不写 when 一直显示

读数 value:

读数内容能用在
rpm转速needle text cells(占断油转速的比例)
speed车速,按玩家设置的单位needle text
speed_kmh speed_mph固定单位的车速needle text
fuel油量 0 到 1needle cells
coolant水温 °Cneedle text cells(40–120 °C 的比例)
air车外气温 °Cneedle text
gear挡位:R N 1…,自动挡 D3 M3text
clock世界时间 hh:mmtext

when: low_fuel(油量低于 12%)、high_beam(远光)、headlights(大灯)。写别的名字,这张图永远不显示。

3. 字体(可选) ​

液晶数字用自己的位图字体才好看。把字符排在一张图上,写进 fonts,再在 text 元素的 font 里写这个名字:

json
"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。

检查 ​

  1. gauges、screens、fonts 里拼错的字段名不会报错,只会用默认值或者不显示,写完对着上面的表看一遍。元素的 type 写错、颜色不是 #rrggbb 这类错误会报出来。
  2. 用测试页的自动截图,看 driver_running 这张:屏幕在通电时才显示,这张发动机是开着的。
  3. 进游戏开一圈:
    • 熄火时指针停在最低读数;
    • 用一个已知车速(比如限速的挡位)看指针读数和 HUD 的车速对不对;
    • 油箱加满,油量表到满刻度;
    • 开远光,high_beam 的图亮起来。
  4. 屏幕画面镜像或颠倒:检查 tl、tr、bl 的顺序和换算([x, z, -y])。