diff --git a/python/face.obj b/python/face.obj index ecf4724..230f3b0 100644 --- a/python/face.obj +++ b/python/face.obj @@ -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 diff --git a/python/generate_normal.py b/python/generate_normal.py new file mode 100644 index 0000000..4b272f0 --- /dev/null +++ b/python/generate_normal.py @@ -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) \ No newline at end of file