카테고리
Course Basiccourse-basic
코드와 해설을 함께 읽는 학습 문서
Code Detail
Control & Dynamics + Data I/O 중심의 Octave 학습 예제
course/basic/load_obj.m
코드를 복사해 Octave에서 바로 실행할 수 있습니다.
function [V, F] = load_obj(filename)
50 lines
function [V, F] = load_obj(filename)
# read obj
# input:
# filename - obj file path
# output:
# V - vertex matrix [N, 3]
# F - face matrix [M, 3]
fid = fopen(filename, "r");
init_capacity = 10000;
V = zeros(init_capacity, 3);
F = zeros(init_capacity, 3);
v_count = 0;
f_count = 0;
while ~feof(fid)
line = strtrim(fgetl(fid));
if startsWith(line, "v ")
vals = sscanf(line(3:end), "%f %f %f"); # [3, 1]
v_count += 1;
if v_count > size(V, 1)
V = [V; zeros(size(V))]; # double capacity
end
V(v_count, :) = transpose(vals);
if mod(v_count, 10000) == 0
printf("Loaded %d vertices\n", v_count);
end
elseif startsWith(line, "f ")
idx = sscanf(line(3:end), "%d %d %d"); # [3, 1]
f_count += 1;
if f_count > size(F, 1)
F = [F; zeros(size(F))]; # double capacity
end
F(f_count, :) = transpose(idx);
if mod(f_count, 10000) == 0
printf("Loaded %d faces\n", f_count);
end
end
end
fclose(fid);
# trim to actual size
V = V(1:v_count, :);
F = F(1:f_count, :);
end