可以參考之前的B樣條曲線插值的方法。
要想利用控制點進行B樣條曲面插值,前提是控制點不能是類似點雲一樣的無序點,一定要是分布在UV坐標空間中的柵格點。
方法就是首先對U方向進行B樣條曲線插值,然后利用插值的結果再在V方向上進行B樣條曲線插值即可。
下面用matlab自帶的Peaks函數作為控制點為例編程。
matlab代碼如下:
clear all;close all;clc; [x,y] = meshgrid(-3:0.3:3); z = 3*(1-x).^2.*exp(-(x.^2) - (y+1).^2) ... - 10*(x/5 - x.^3 - y.^5).*exp(-x.^2-y.^2) ... - 1/3*exp(-(x+1).^2 - y.^2); plot3(x(:),y(:),z(:),'b.'); hold on; %%對行進行B樣條插值 u = [];v = [];w = []; [H,~] = size(x); for k=1:H re=[]; for i=1:length(x(k,:))-2 for t=0:0.1:1 b0 = 1/2*(1-t)^2; b1 = 1/2*(-2*t^2+2*t+1); b2 = 1/2*t^2; x1=b0*x(k,i)+b1*x(k,i+1)+b2*x(k,i+2); y1=b0*y(k,i)+b1*y(k,i+1)+b2*y(k,i+2); z1=b0*z(k,i)+b1*z(k,i+1)+b2*z(k,i+2); re=[re [x1;y1;z1]]; end end u = [u ; re(1,:)]; v = [v ; re(2,:)]; w = [w ; re(3,:)]; end x = u;y = v;z = w; plot3(x(:),y(:),z(:),'g.'); %對列進行B樣條插值 u=[];v=[];w=[]; [~,W] = size(x); for k=1:W re=[]; for i=1:length(x(:,k))-2 for t=0:0.1:1 b0 = 1/2*(1-t)^2; b1 = 1/2*(-2*t^2+2*t+1); b2 = 1/2*t^2; x1=b0*x(i,k)+b1*x(i+1,k)+b2*x(i+2,k); y1=b0*y(i,k)+b1*y(i+1,k)+b2*y(i+2,k); z1=b0*z(i,k)+b1*z(i+1,k)+b2*z(i+2,k); re=[re;x1 y1 z1]; end end u = [u re(:,1)]; v = [v re(:,2)]; w = [w re(:,3)]; end plot3(u(:),v(:),w(:),'r.');
結果如下:
其中藍點為原始控制點,綠點為行方向插值結果,紅點為列方向插值結果即最終結果。