我目前的工作之一是爲iOS Cocos2D創建2D可破壞地形引擎(請參閱https://github.com/crebstar/PWNDestructibleTerrain)。毫無疑問,它處於嬰兒階段,但自從幾周前開始以來,我取得了重大進展。但是,我遇到了一些表面法線計算的表現障礙。確定一組像素表面法線的最佳方法?
注意:對於我的可破壞地形引擎,一個0的alpha值被認爲不是固體地面。
下面發佈的方法只適用於很小的矩形,比如n < 30.任何大於30的值都會導致幀速下降。如果你接近100x100,那麼當精靈嘗試遍歷地形時,你可能會讀一本書。目前這是最好的,我可以想出一個精靈角度變化,因爲它橫跨地形漫遊(以得到一個精靈的方向的角度只是100 *正常*(1,0)矢量的點積)。
-(CGPoint)getAverageSurfaceNormalAt:(CGPoint)pt withRect:(CGRect)area {
float avgX = 0;
float avgY = 0;
ccColor4B color = ccc4(0, 0, 0, 0);
CGPoint normal;
float len;
for (int w = area.size.width; w >= -area.size.width; w--) {
for (int h = area.size.height; h >= -area.size.height; h--) {
CGPoint pixPt = ccp(w + pt.x, h + pt.y);
if ([self pixelAt:pixPt colorCache:&color]) {
if (color.a != 0) {
avgX -= w;
avgY -= h;
} // end inner if
} // end outer if
} // end inner for
} // end outer for
len = sqrtf(avgX * avgX + avgY * avgY);
if (len == 0) {
normal = ccp(avgX, avgY);
} else {
normal = ccp(avgX/len, avgY/len);
} // end if
return normal;
} // end get
我的問題是我有精靈,需要更大的矩形,以便他們的運動看起來逼真。我考慮過對所有曲面法線進行緩存,但這導致了知道何時重新計算曲面法線的問題,而且這些計算也相當昂貴(塊應該多大?)。另一個較小的問題是,我不知道如何正確處理長度= 0時的情況。
因此,我卡住了......任何來自社區的建議將不勝感激!我的方法是最好的嗎?或者我應該重新考慮算法?我是遊戲開發新手,總是希望學習新的技巧和竅門。
不是說這個問題在這裏不合適,但我想你可能會在[GameDev.SE]上得到很好的回答。 –
好點。我會看看遊戲開發網站,並在那裏發佈問題 –
我不知道你估計法線的二維體積的形狀,但是如果你有一組1d曲線將0 alpha從非0 alpha,那麼你可以參數化或找到你的離散1d曲線的近似參數化。這樣你可以得到一個恆定的時間解決方案來計算一個正常的。 –