Привет, я пытаюсь преобразовать вершины, хранящиеся в файле .obj, в таблицу, которая может быть фактически использована в lua.Lua множественные замены строк string.gsub
Это то, что файл .obj выглядит следующим образом:
# Blender v2.77 (sub 0) OBJ File: ''
# www.blender.org
mtllib pyramid.mtl
o Cube
v 1.000000 0.000000 -1.000000
v 1.000000 0.000000 1.000000
v -1.000000 0.000000 1.000000
v -1.000000 0.000000 -1.000000
v -0.000000 2.000000 0.000000
vn 0.0000 -1.0000 0.0000
vn 0.8944 0.4472 0.0000
vn -0.0000 0.4472 0.8944
vn -0.8944 0.4472 -0.0000
vn 0.0000 0.4472 -0.8944
usemtl Material
s off
f 1//1 2//1 3//1 4//1
f 1//2 5//2 2//2
f 2//3 5//3 3//3
f 3//4 5//4 4//4
f 5//5 1//5 4//5
Все, что мне нужно являются 5 строк, начиная с V, чтобы выглядеть следующим образом:
Node1= {x=1.000000, y=0.000000, z=-1.000000}
Node2= {x=1.000000, y=0.000000, z=1.000000}
Node3= {x=-1.000000, y=0.000000, z=1.000000}
Node4= {x=-1.000000, y=0.000000, z=-1.000000}
Node5= {x=-0.000000, y=2.000000, z=0.000000}
С кодом я написал, я руководила вывод выглядеть следующим образом:
Node1= {x=1.000000 0.000000 -1.000000}
Node2= {x=1.000000 0.000000 1.000000}
Node3= {x=-1.000000 0.000000 1.000000}
Node4= {x=-1.000000 0.000000 -1.000000}
Node5= {x=-0.000000 2.000000 0.000000}
Thats мой код, который делает работу:
inputFile = io.open("file.txt", "r")
io.input(inputFile)
string = io.read("*all")
io.close(inputFile)
outputFile = io.open("object.lua", "a")
io.output(otputFile)
i = 1
for word in
string.gmatch(string, " .?%d.%d%d%d%d%d%d .?%d.%d%d%d%d%d%d .?%d.%d%d%d%d%d%d") do
print(word)
-- outputFile:write("Node"..i.. "= {" ..word.. "}\n")
outputFile:write("Node"..i.. "= {" ..string.gsub(word, "(%s)", "x=", 1).. "}\n")
i = i + 1
end
Сначала он открывает файл .obj и сохраняет все в строке. Чем он создает «object.lua». Для каждой строки, которая сопрягает этот шаблон:
1.000000 0.000000 -1.000000
в строке, string.gmatch будет найти и записать его в файл вывода. Но сначала он должен переформатировать строку. Как вы видите, мне удалось заменить первое пространство (% s) на «x =». Кроме того, второе пространство необходимо заменить на «, y =», а третье с «, z =». Однако я не вижу, как использовать string.gsub таким образом, чтобы он мог выполнять несколько разных заметок.
Правильно ли это, и я просто делаю что-то неправильно? Или есть другой способ выполнить эту задачу?
Смешное наблюдение: 'string' изменило его значение (поскольку переменная с тем же именем была введена), но' string.gmatch' остался верным! –
'для x, y, z в строке: gmatch '\ nv% s + (% S +)% s + (% S +)% s + (% S +)'' ''Node' .. i .. '= {x =' ..x .. ', y =' .. y .. ', z =' .. z .. '} \ n'' –