添加法线

This commit is contained in:
xsl
2025-09-26 12:21:54 +08:00
parent 75c20ecfed
commit 7d3427e4c0
2 changed files with 658 additions and 0 deletions
+479
View File
@@ -958,6 +958,485 @@ v 0.566714 0.424674 -0.000015
# 顶点 477
v 0.580471 0.438213 -0.000013
vn -0.157857 -0.117448 -0.980453
vn -0.119837 0.273587 -0.954353
vn -0.128373 0.314910 -0.940400
vn -0.610928 -0.681921 -0.402182
vn -0.132994 -0.246226 -0.960044
vn -0.123946 -0.670973 -0.731049
vn -0.108346 -0.777778 -0.619131
vn -0.684593 -0.362166 -0.632589
vn -0.163238 -0.084285 -0.982980
vn -0.149706 -0.344610 -0.926732
vn -0.146321 -0.575508 -0.804600
vn -0.160774 0.221591 -0.961795
vn -0.142939 0.540001 -0.829438
vn -0.130929 0.701902 -0.700136
vn -0.132220 -0.586515 -0.799073
vn -0.129404 -0.572935 -0.809321
vn -0.142849 -0.343520 -0.928218
vn -0.153929 0.113041 -0.981594
vn -0.128523 -0.010030 -0.991656
vn -0.088288 0.729993 -0.677728
vn -0.636811 0.578677 -0.509515
vn -0.969362 -0.224245 -0.100262
vn -0.218172 -0.395910 -0.891996
vn -0.390156 -0.306586 -0.868207
vn -0.556957 -0.311576 -0.769883
vn -0.679451 -0.348525 -0.645660
vn -0.194283 -0.580382 -0.790829
vn -0.252431 0.252323 -0.934137
vn -0.113347 0.265323 -0.957474
vn -0.381453 0.264796 -0.885651
vn -0.511917 0.309356 -0.801399
vn -0.698691 -0.390333 -0.599559
vn -0.654967 -0.076978 -0.751726
vn -0.632232 0.100210 -0.768271
vn -0.988822 -0.147172 -0.023900
vn -0.811684 -0.022640 -0.583658
vn -0.415885 -0.351885 -0.838580
vn -0.362444 -0.111269 -0.925340
vn -0.263204 0.656847 -0.706595
vn -0.598851 0.007337 -0.800827
vn -0.633756 0.262924 -0.727479
vn -0.337229 0.640694 -0.689773
vn -0.290734 0.743110 -0.602712
vn -0.614569 -0.328323 -0.717293
vn -0.465068 0.289013 -0.836769
vn -0.624926 -0.303809 -0.719144
vn -0.857381 0.038732 -0.513223
vn -0.733323 -0.534735 -0.419875
vn -0.917758 0.112721 -0.380806
vn -0.971770 -0.232573 -0.039655
vn -0.742226 -0.268963 -0.613807
vn -0.571557 -0.650561 -0.500093
vn -0.550789 -0.003127 -0.834639
vn -0.676850 -0.017683 -0.735908
vn -0.895687 -0.409162 -0.174157
vn -0.465529 0.207493 -0.860366
vn -0.099111 0.299117 -0.949055
vn -0.475206 0.043895 -0.878779
vn -0.967131 0.253160 0.023841
vn -0.067552 0.591760 -0.803279
vn -0.701432 0.163074 -0.693830
vn -0.660510 -0.001308 -0.750816
vn -0.697752 -0.297622 -0.651585
vn -0.852534 -0.353566 -0.384938
vn -0.862332 0.381581 -0.332835
vn -0.386268 0.285397 -0.877123
vn -0.466095 -0.365277 -0.805809
vn -0.565578 -0.628499 -0.533957
vn -0.908045 -0.388486 -0.156628
vn -0.458071 -0.664675 -0.590236
vn -0.960308 -0.194515 -0.199933
vn -0.964776 -0.242581 -0.101793
vn -0.380844 0.318965 -0.867882
vn -0.492042 0.373384 -0.786435
vn -0.478188 0.536839 -0.695083
vn -0.404840 0.329011 -0.853145
vn -0.815303 -0.135648 -0.562922
vn -0.740418 -0.529167 -0.414444
vn -0.526986 -0.682836 -0.505986
vn -0.499321 0.751537 -0.431128
vn -0.169673 0.838571 -0.517696
vn -0.219605 0.797386 -0.562094
vn -0.258173 0.737293 -0.624296
vn -0.334590 0.135549 -0.932564
vn -0.413710 0.025262 -0.910058
vn -0.293211 -0.429325 -0.854229
vn -0.290040 -0.635629 -0.715439
vn -0.339300 -0.598067 -0.726079
vn -0.484679 -0.817168 -0.311967
vn -0.490798 -0.766282 -0.414642
vn -0.647188 -0.502418 -0.573344
vn -0.748078 -0.142671 -0.648092
vn -0.679772 -0.065369 -0.730505
vn -0.991413 0.068428 0.111434
vn -0.054539 0.827746 -0.558446
vn -0.522175 -0.822319 -0.226108
vn -0.498764 -0.835104 -0.232025
vn -0.573347 0.057293 -0.817307
vn -0.752396 0.070652 -0.654912
vn -0.695453 0.182717 -0.694953
vn -0.554854 -0.525950 -0.644603
vn -0.495384 -0.491707 -0.716114
vn -0.996116 0.035619 -0.080529
vn -0.807615 -0.518641 -0.280660
vn -0.748369 -0.572540 -0.334875
vn -0.654549 -0.488554 -0.576958
vn -0.644511 -0.052985 -0.762757
vn -0.287107 -0.341358 -0.895011
vn -0.302272 -0.610020 -0.732466
vn -0.332675 -0.566326 -0.754057
vn -0.648946 -0.339719 -0.680779
vn -0.814141 -0.316143 -0.487061
vn -0.442642 -0.650887 -0.616777
vn -0.695192 0.252386 -0.673060
vn -0.839074 -0.493593 -0.228736
vn -0.876677 -0.026484 -0.480350
vn -0.952011 -0.168209 -0.255696
vn -0.725635 -0.402182 -0.558304
vn -0.528463 -0.468266 -0.708134
vn -0.417297 -0.505946 -0.754905
vn -0.448280 -0.554820 -0.700871
vn -0.597240 -0.600283 -0.531944
vn -0.732673 -0.566414 -0.377314
vn -0.937537 -0.089135 -0.336272
vn -0.849190 0.095406 -0.519398
vn -0.367759 0.689946 -0.623481
vn -0.785277 -0.386959 -0.483325
vn -0.994313 -0.102014 0.030574
vn -0.746438 -0.571671 -0.340622
vn -0.932793 -0.157190 -0.324328
vn -0.520931 0.112091 -0.846207
vn -0.876588 -0.447940 -0.175908
vn -0.984160 0.163837 0.067726
vn -0.486312 -0.313467 -0.815622
vn -0.811974 -0.518346 -0.268355
vn -0.921857 0.269151 -0.278813
vn -0.914605 0.363857 -0.176370
vn -0.998523 0.050025 -0.021214
vn -0.947370 0.250226 -0.199691
vn -0.984160 -0.167800 -0.057210
vn -0.763853 0.298501 -0.572211
vn -0.244898 0.809943 -0.532933
vn -0.503561 -0.332902 -0.797247
vn -0.939590 -0.161793 -0.301652
vn -0.533238 -0.331365 -0.778367
vn -0.317318 -0.352295 -0.880453
vn -0.785350 -0.410831 -0.463081
vn -0.967689 0.064702 -0.243706
vn -0.479638 0.627533 -0.613310
vn -0.838152 0.422661 -0.344760
vn -0.871368 0.408789 -0.271310
vn -0.143140 -0.571383 -0.808105
vn -0.148614 0.667385 -0.729733
vn -0.132647 -0.409302 -0.902705
vn -0.043635 -0.557089 -0.829306
vn -0.196308 -0.738296 -0.645277
vn -0.965742 -0.092485 -0.242465
vn 0.039961 0.173970 -0.983940
vn -0.112567 0.183385 -0.976575
vn -0.243236 0.224570 -0.943613
vn -0.388552 0.291555 -0.874084
vn -0.508120 0.405064 -0.760090
vn -0.991120 -0.117280 -0.062656
vn -0.646358 -0.349248 -0.678415
vn -0.143216 -0.234800 -0.961435
vn -0.622317 -0.306458 -0.720281
vn -0.345203 0.730598 -0.589119
vn -0.423624 -0.217197 -0.879414
vn -0.145231 -0.568718 -0.809610
vn -0.875495 0.257934 -0.408630
vn -0.850191 0.325159 -0.414061
vn -0.511264 0.294961 -0.807222
vn -0.940503 0.334942 -0.057174
vn -0.074558 0.226929 -0.971053
vn -0.860104 -0.461984 -0.216317
vn -0.151581 0.530682 -0.833907
vn -0.771131 0.483341 -0.414413
vn -0.990077 0.131989 -0.048235
vn -0.402547 -0.718532 -0.567157
vn -0.388516 -0.724702 -0.569088
vn -0.490536 -0.432775 -0.756360
vn -0.585094 0.031097 -0.810369
vn -0.558811 -0.001352 -0.829294
vn -0.351909 0.687982 -0.634697
vn -0.501617 0.564033 -0.655933
vn -0.528836 0.472406 -0.705099
vn -0.624394 0.136338 -0.769119
vn -0.888334 -0.019905 -0.458766
vn -0.845489 -0.497892 -0.193010
vn -0.750005 0.181199 -0.636129
vn -0.411576 0.247242 -0.877198
vn 0.038810 0.922572 -0.383868
vn -0.931384 0.120842 -0.343396
vn -0.802479 -0.144491 -0.578922
vn -0.604929 -0.076977 -0.792550
vn -0.096891 -0.820424 -0.563486
vn -0.693446 -0.622774 -0.362333
vn -0.098936 -0.807901 -0.580955
vn -0.865886 -0.490948 -0.095978
vn -0.147265 0.021839 -0.988856
vn -0.124725 -0.240433 -0.962619
vn -0.384776 -0.180825 -0.905124
vn -0.678587 -0.052489 -0.732642
vn -0.492760 -0.337015 -0.802252
vn -0.669253 -0.053113 -0.741134
vn -0.629533 -0.218747 -0.745545
vn -0.536934 -0.239337 -0.808962
vn -0.760821 -0.038319 -0.647830
vn -0.426951 -0.114149 -0.897041
vn -0.894277 -0.443768 -0.057783
vn -0.788618 0.090049 -0.608255
vn -0.765371 0.045103 -0.642007
vn -0.662347 0.029016 -0.748635
vn -0.951037 0.109388 -0.289071
vn -0.861182 0.091132 -0.500061
vn -0.974979 0.202443 -0.091834
vn -0.642386 -0.042784 -0.765186
vn -0.871669 -0.422453 -0.248449
vn -0.580824 0.566204 -0.584856
vn -0.404304 0.615481 -0.676551
vn -0.843793 -0.112207 -0.524807
vn -0.357124 0.445554 -0.820941
vn -0.227522 0.325016 -0.917932
vn -0.351121 0.186045 -0.917661
vn -0.508493 0.163127 -0.845473
vn -0.669192 0.225191 -0.708146
vn -0.682635 -0.022622 -0.730409
vn -0.997388 -0.072192 -0.002429
vn -0.654244 -0.390045 -0.647943
vn -0.543757 -0.404709 -0.735214
vn -0.389752 -0.409587 -0.824822
vn -0.311461 -0.461841 -0.830479
vn -0.442690 -0.597730 -0.668389
vn -0.665322 -0.567990 -0.484494
vn -0.993700 -0.024428 0.109382
vn -0.336571 0.515665 -0.787915
vn -0.833255 -0.513401 -0.205196
vn -0.655358 0.499906 -0.566216
vn -0.636059 0.731171 -0.246614
vn -0.636229 0.698436 -0.327720
vn -0.532730 0.296960 -0.792473
vn -0.543680 0.752620 -0.371450
vn -0.616445 0.600503 -0.509306
vn -0.700189 -0.272994 -0.659704
vn -0.809167 -0.365862 -0.459775
vn -0.874944 -0.418516 -0.243551
vn -0.569283 0.534135 -0.624993
vn -0.539129 0.436846 -0.720073
vn 0.454850 -0.705475 -0.543522
vn 0.408211 -0.433019 -0.803653
vn 0.444474 0.660817 -0.604785
vn 0.894262 -0.204831 -0.397918
vn -0.114409 -0.363086 -0.924705
vn 0.081504 -0.273941 -0.958287
vn 0.264141 -0.284064 -0.921703
vn 0.435588 -0.376506 -0.817622
vn -0.125894 -0.533947 -0.836093
vn -0.072754 0.174790 -0.981914
vn -0.211495 0.199952 -0.956707
vn 0.094753 0.214224 -0.972178
vn 0.226207 0.328124 -0.917151
vn 0.476069 -0.392222 -0.787096
vn 0.386653 -0.071595 -0.919442
vn 0.330539 0.074160 -0.940874
vn 0.946905 -0.119587 -0.298445
vn 0.540976 0.015395 -0.840897
vn 0.100846 -0.309113 -0.945663
vn 0.063171 -0.119717 -0.990796
vn -0.017896 0.642546 -0.766038
vn 0.333980 -0.014725 -0.942465
vn 0.380697 0.257309 -0.888179
vn 0.068112 0.650019 -0.756860
vn 0.065937 0.735296 -0.674531
vn 0.400581 -0.278998 -0.872751
vn 0.194475 0.270930 -0.942749
vn 0.381649 -0.269766 -0.884065
vn 0.615574 0.046015 -0.786734
vn 0.545476 -0.536828 -0.643639
vn 0.727145 0.144279 -0.671151
vn 0.927940 -0.242782 -0.282814
vn 0.466986 -0.253795 -0.847061
vn 0.391417 -0.650509 -0.650869
vn 0.223812 -0.034118 -0.974035
vn 0.366096 -0.046639 -0.929408
vn 0.790992 -0.412150 -0.452178
vn 0.168181 0.209548 -0.963226
vn -0.197093 0.225498 -0.954099
vn 0.188290 0.093752 -0.977629
vn 0.939692 0.249236 -0.234223
vn -0.063834 0.644034 -0.762329
vn 0.428616 0.283999 -0.857690
vn 0.419036 0.086465 -0.903843
vn 0.445596 -0.144931 -0.883425
vn 0.670143 -0.372842 -0.641793
vn 0.713407 0.416837 -0.563291
vn 0.089433 0.265664 -0.959909
vn 0.164903 -0.358844 -0.918715
vn 0.316171 -0.624061 -0.714551
vn 0.811159 -0.392839 -0.433242
vn 0.212527 -0.652151 -0.727689
vn 0.857619 -0.209164 -0.469830
vn 0.893408 -0.232951 -0.384129
vn 0.065972 0.316731 -0.946218
vn 0.218147 0.357328 -0.908146
vn 0.210255 0.562562 -0.799573
vn 0.048769 0.353226 -0.934266
vn 0.597955 -0.031114 -0.800926
vn 0.598886 -0.562365 -0.570158
vn 0.433311 -0.636236 -0.638315
vn 0.304301 0.774954 -0.553938
vn -0.020878 0.795868 -0.605110
vn 0.002533 0.783921 -0.620855
vn 0.008736 0.683967 -0.729461
vn 0.023435 0.165341 -0.985958
vn 0.097846 0.057449 -0.993542
vn 0.026655 -0.409331 -0.911997
vn 0.070020 -0.618934 -0.782315
vn 0.092721 -0.630847 -0.770347
vn 0.409819 -0.791039 -0.454209
vn 0.382164 -0.757518 -0.529261
vn 0.493523 -0.476034 -0.727892
vn 0.539205 -0.137380 -0.830894
vn 0.418831 -0.070980 -0.905286
vn 0.986933 0.055707 -0.151193
vn 0.493470 -0.771912 -0.400797
vn 0.465506 -0.805744 -0.366171
vn 0.315981 0.035930 -0.948085
vn 0.518716 0.081342 -0.851068
vn 0.462785 0.182249 -0.867534
vn 0.297107 -0.507853 -0.808587
vn 0.210386 -0.458985 -0.863174
vn 0.960656 0.014050 -0.277384
vn 0.656210 -0.518111 -0.548589
vn 0.577419 -0.577784 -0.576847
vn 0.399230 -0.494824 -0.771858
vn 0.400883 -0.033284 -0.915525
vn -0.008315 -0.335603 -0.941967
vn 0.023684 -0.603233 -0.797214
vn 0.034899 -0.569581 -0.821194
vn 0.377257 -0.367745 -0.849965
vn 0.594885 -0.330477 -0.732733
vn 0.151774 -0.645015 -0.748947
vn 0.375446 0.291550 -0.879795
vn 0.711923 -0.513977 -0.478533
vn 0.688950 -0.004557 -0.724795
vn 0.824694 -0.176503 -0.537333
vn 0.492354 -0.409779 -0.767899
vn 0.252615 -0.458422 -0.852076
vn 0.131510 -0.485245 -0.864432
vn 0.173988 -0.540706 -0.823022
vn 0.370374 -0.600183 -0.708945
vn 0.561193 -0.585737 -0.584786
vn 0.779313 -0.098650 -0.618821
vn 0.593701 0.153003 -0.790006
vn 0.196140 0.692132 -0.694610
vn 0.591967 -0.372306 -0.714817
vn 0.969067 -0.077038 -0.234465
vn 0.581669 -0.595887 -0.553696
vn 0.819149 -0.133497 -0.557829
vn 0.238421 0.063984 -0.969052
vn 0.789920 -0.441515 -0.425549
vn 0.972040 0.139257 -0.189067
vn 0.057462 -0.314078 -0.947657
vn 0.693157 -0.522721 -0.496282
vn 0.739950 0.272322 -0.615072
vn 0.790496 0.361690 -0.494263
vn 0.958590 0.040656 -0.281872
vn 0.819688 0.255140 -0.512850
vn 0.932700 -0.157964 -0.324218
vn 0.499548 0.299430 -0.812892
vn 0.083532 0.820153 -0.566014
vn 0.186487 -0.280786 -0.941479
vn 0.787146 -0.136486 -0.601476
vn 0.238126 -0.364158 -0.900380
vn 0.007287 -0.363717 -0.931481
vn 0.645009 -0.420021 -0.638393
vn 0.839904 0.068556 -0.538387
vn 0.197300 0.636047 -0.746001
vn 0.626750 0.432393 -0.648244
vn 0.690255 0.402132 -0.601530
vn -0.170048 -0.417506 -0.892621
vn -0.247796 -0.515074 -0.820546
vn -0.080811 -0.694954 -0.714499
vn 0.844324 -0.066101 -0.531741
vn -0.340340 0.068977 -0.937769
vn -0.200540 0.109107 -0.973591
vn -0.100527 0.181664 -0.978209
vn 0.094829 0.280911 -0.955037
vn 0.229554 0.387707 -0.892742
vn 0.930935 -0.080592 -0.356180
vn 0.366088 -0.414320 -0.833258
vn 0.373518 -0.311428 -0.873783
vn 0.101419 0.749991 -0.653626
vn 0.156448 -0.234954 -0.959333
vn 0.643712 0.248871 -0.723670
vn 0.630486 0.320510 -0.706938
vn 0.214515 0.300675 -0.929289
vn 0.878408 0.335787 -0.340068
vn -0.262455 0.138240 -0.954991
vn 0.741140 -0.487892 -0.461164
vn 0.536215 0.491979 -0.685880
vn 0.943726 0.117453 -0.309171
vn 0.252325 -0.681862 -0.686583
vn 0.241799 -0.694384 -0.677764
vn 0.256437 -0.424027 -0.868586
vn 0.306119 0.053652 -0.950480
vn 0.270754 0.029516 -0.962196
vn 0.091458 0.705352 -0.702932
vn 0.222280 0.605321 -0.764315
vn 0.257340 0.499918 -0.826957
vn 0.348374 0.140406 -0.926780
vn 0.653396 0.002004 -0.757014
vn 0.726583 -0.526114 -0.441906
vn 0.457252 0.192072 -0.868348
vn 0.024687 0.216176 -0.976042
vn -0.160486 0.893703 -0.418973
vn 0.737559 0.139254 -0.660768
vn 0.577788 -0.157188 -0.800908
vn 0.338594 -0.046212 -0.939797
vn 0.540829 -0.644375 -0.540634
vn 0.793925 -0.513592 -0.325434
vn 0.112988 -0.172200 -0.978561
vn 0.380219 -0.028586 -0.924455
vn 0.181942 -0.311670 -0.932609
vn 0.405675 -0.040496 -0.913120
vn 0.311617 -0.183545 -0.932312
vn 0.229757 -0.215696 -0.949045
vn 0.448979 -0.011642 -0.893467
vn 0.157043 -0.116421 -0.980706
vn 0.849173 -0.441846 -0.289270
vn 0.509987 0.101136 -0.854216
vn 0.502497 0.042382 -0.863539
vn 0.346830 0.049796 -0.936605
vn 0.789142 0.131175 -0.600041
vn 0.593830 0.110576 -0.796956
vn 0.903119 0.207614 -0.375863
vn 0.335467 -0.027738 -0.941644
vn 0.749363 -0.431754 -0.502040
vn 0.398722 0.556700 -0.728770
vn 0.159415 0.619185 -0.768893
vn 0.633699 -0.103057 -0.766684
vn 0.068828 0.420231 -0.904803
vn -0.088663 0.243948 -0.965727
vn 0.028039 0.088562 -0.995676
vn 0.196340 0.128200 -0.972119
vn 0.351608 0.234772 -0.906231
vn 0.401167 -0.024876 -0.915667
vn 0.960510 -0.059404 -0.271829
vn 0.403250 -0.363753 -0.839686
vn 0.263046 -0.370792 -0.890685
vn 0.088544 -0.372991 -0.923600
vn -0.020440 -0.422138 -0.906301
vn 0.171241 -0.593300 -0.786557
vn 0.447940 -0.597460 -0.665125
vn 0.988307 -0.005346 -0.152383
vn 0.048883 0.565646 -0.823198
vn 0.731655 -0.535076 -0.422345
vn 0.448720 0.492887 -0.745461
vn 0.512870 0.781166 -0.356011
vn 0.473893 0.738222 -0.480055
vn 0.221524 0.339691 -0.914077
vn 0.377685 0.773714 -0.508645
vn 0.373587 0.663078 -0.648661
vn 0.342115 -0.286605 -0.894883
vn 0.604377 -0.400864 -0.688503
vn 0.746569 -0.450215 -0.489838
vn 0.284146 0.505382 -0.814770
vn 0.233946 0.442438 -0.865747
vn 0.000000 1.000000 0.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 1.000000 0.000000
# 面 127 34 139
f 128 35 140
# 面 11 0 37
+179
View File
@@ -0,0 +1,179 @@
import numpy as np
import sys
import os
def compute_vertex_normals(vertices, faces):
"""
计算顶点法线
Args:
vertices: 顶点列表,每个顶点是[x, y, z]
faces: 面列表,每个面是顶点索引列表(三角形面为3个索引)
Returns:
normals: 顶点法线列表,每个法线是[nx, ny, nz]
"""
# 初始化法线数组
normals = np.zeros_like(vertices, dtype=np.float64)
# 计算每个面的法线并累加到对应的顶点
for face in faces:
if len(face) < 3:
continue
# 获取三角形的三个顶点
v0 = vertices[face[0]]
v1 = vertices[face[1]]
v2 = vertices[face[2]]
# 计算两条边向量
edge1 = v1 - v0
edge2 = v2 - v0
# 计算面法线(叉积)
face_normal = np.cross(edge1, edge2)
# 面法线长度(用于加权平均)
face_area = np.linalg.norm(face_normal)
# 如果面法线长度不为零,则归一化并加权
if face_area > 1e-10:
face_normal_normalized = face_normal / face_area
# 将面法线累加到每个顶点
for vertex_index in face:
normals[vertex_index] += face_normal_normalized
# 归一化所有顶点法线
for i in range(len(normals)):
length = np.linalg.norm(normals[i])
if length > 1e-10:
normals[i] /= length
else:
# 如果法线长度为零(可能是孤立顶点),设置为默认向上法线
normals[i] = np.array([0.0, 1.0, 0.0])
return normals
def parse_obj_file(filename):
"""
解析OBJ文件
Returns:
vertices: 顶点列表
faces: 面索引列表
has_normals: 是否已经包含法线
"""
vertices = []
faces = []
existing_normals = []
has_normals = False
try:
with open(filename, 'r', encoding='utf-8') as file:
for line in file:
line = line.strip()
if not line or line.startswith('#'):
continue
parts = line.split()
if not parts:
continue
if parts[0] == 'v': # 顶点
if len(parts) >= 4:
vertex = [float(parts[1]), float(parts[2]), float(parts[3])]
vertices.append(vertex)
elif parts[0] == 'vn': # 法线
if len(parts) >= 4:
normal = [float(parts[1]), float(parts[2]), float(parts[3])]
existing_normals.append(normal)
has_normals = True
elif parts[0] == 'f': # 面
face_vertices = []
for part in parts[1:]:
# 处理 f v1/vt1/vn1 v2/vt2/vn2 格式
vertex_data = part.split('/')
if vertex_data[0]: # 顶点索引
# OBJ索引从1开始,转换为从0开始
vertex_index = int(vertex_data[0]) - 1
face_vertices.append(vertex_index)
if len(face_vertices) >= 3:
# 如果是四边形或多边形,分解为三角形
for i in range(1, len(face_vertices) - 1):
faces.append([face_vertices[0], face_vertices[i], face_vertices[i + 1]])
except UnicodeDecodeError:
print(f"错误: 无法读取文件 {filename},请确保文件是UTF-8编码。")
sys.exit(1)
return np.array(vertices), faces, has_normals
def write_obj_file(filename, vertices, faces, normals, original_has_normals=False):
"""
写入OBJ文件
"""
with open(filename, 'w', encoding='utf-8') as file:
file.write("# OBJ文件 - 自动计算法线\n")
file.write(f"# 顶点数: {len(vertices)}\n")
file.write(f"# 面数: {len(faces)}\n\n")
# 写入顶点
for i, vertex in enumerate(vertices):
file.write(f"v {vertex[0]:.6f} {vertex[1]:.6f} {vertex[2]:.6f}\n")
file.write("\n")
# 写入法线
for i, normal in enumerate(normals):
file.write(f"vn {normal[0]:.6f} {normal[1]:.6f} {normal[2]:.6f}\n")
file.write("\n")
# 写入面(使用顶点索引/法线索引格式)
for face in faces:
face_line = "f"
for vertex_index in face:
# 如果原始文件有法线或者我们计算了法线,使用 v//vn 格式
face_line += f" {vertex_index + 1}//{vertex_index + 1}"
file.write(face_line + "\n")
def process_obj_file(input_file, output_file=None):
"""
处理OBJ文件的主要函数
"""
if output_file is None:
base_name = os.path.splitext(input_file)[0]
output_file = f"{base_name}_with_normals.obj"
print(f"读取文件: {input_file}")
vertices, faces, has_normals = parse_obj_file(input_file)
print(f"找到 {len(vertices)} 个顶点, {len(faces)} 个面")
if has_normals:
print("警告: 输入文件已包含法线数据,将被重新计算")
if len(vertices) == 0:
print("错误: 没有找到顶点数据")
return False
if len(faces) == 0:
print("错误: 没有找到面数据")
return False
print("计算顶点法线中...")
normals = compute_vertex_normals(vertices, faces)
print("写入输出文件...")
write_obj_file(output_file, vertices, faces, normals, has_normals)
print(f"完成! 输出文件: {output_file}")
return True
if __name__ == "__main__":
input_file = "face.obj" # 默认输入文件
output_file = "face_with_normals.obj" # 默认输出文件
process_obj_file(input_file, output_file)