Class - size not compatible : C_NPC 7496 21

O temacie

Autor kaczka

Zaczęty 30.01.2012 roku

Wyświetleń 7496

Odpowiedzi 21

kaczka

kaczka

RaveN Studio
Definitely not kaczka!
posty2280
Propsy2392
NagrodyV
ProfesjaLvl designer
  • RaveN Studio
  • Definitely not kaczka!
Przed chwilą zaszalałem trochę i zaczęło mi się pojawiać coś takiego.

Cóż to i co ważniejsze, jak się tego pozbyć? Allach, Monk, jakbyście byli tak mili...
 

Demonical Monk

Demonical Monk

Użytkownicy
posty145
Propsy152
  • Użytkownicy
Co zrobiłeś? Pokaż kod? Wróżbitami to my nie jesteśmy (póki co).
Wygląda jakbyś spieprzył gdzieś definicję C_NPC w skryptach (dorzuciłeś 2 inty/tablicę dwuelementową/dwa pointery/whatever).
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
Właściwie to nie ważne co tam zrobiłeś, ważne że cokolwiek, a to ZŁO.
Oryginały:
G1
Spoiler
CLASS C_NPC  { VAR INT     id ; // absolute ID des NPCs VAR STRING name [5] ; // Namen des NPC VAR STRING slot ; VAR INT npcType ; VAR INT    flags ; VAR INT     attribute [ATR_INDEX_MAX] ; VAR INT protection [PROT_INDEX_MAX]; VAR INT damage [DAM_INDEX_MAX] ; VAR INT damagetype ; VAR INT    guild,level ; VAR FUNC    mission [MAX_MISSIONS] ; var INT fight_tactic ; VAR INT    weapon ; VAR INT voice ; VAR INT voicePitch ; VAR INT bodymass ; VAR FUNC daily_routine ; // Tagesablauf VAR FUNC    start_aistate ; // Zustandsgesteuert // ********************** // Spawn // ********************** VAR STRING spawnPoint ; // Beim Tod, wo respawnen ? VAR INT spawnDelay ; // Mit Delay in (Echtzeit)-Sekunden // ********************** // SENSES // ********************** VAR INT senses ; // Sinne VAR INT senses_range ; // Reichweite der Sinne in cm // ********************** // Feel free to use // ********************** VAR INT aivar [50] ; VAR STRING wp ; // ********************** // Experience dependant // ********************** VAR INT exp ; // EXerience Points VAR INT exp_next ; // EXerience Points needed to advance to next level VAR INT lp ;       // Learn Points };

G2:
Spoiler
CLASS C_NPC  { VAR INT     id ; // absolute ID des NPCs VAR STRING name [5] ; // Namen des NPC VAR STRING slot ; VAR STRING effect; VAR INT npcType ; VAR INT    flags ; VAR INT     attribute [ATR_INDEX_MAX] ; var int HitChance [MAX_HITCHANCE] ; VAR INT protection [PROT_INDEX_MAX]; VAR INT damage [DAM_INDEX_MAX] ; VAR INT damagetype ; VAR INT    guild,level ; VAR FUNC    mission [MAX_MISSIONS] ; var INT fight_tactic ; VAR INT    weapon ; VAR INT voice ; VAR INT voicePitch ; VAR INT bodymass ; VAR FUNC daily_routine ; // Tagesablauf VAR FUNC    start_aistate ; // Zustandsgesteuert // ********************** // Spawn // ********************** VAR STRING spawnPoint ; // Beim Tod, wo respawnen ? VAR INT spawnDelay ; // Mit Delay in (Echtzeit)-Sekunden // ********************** // SENSES // ********************** VAR INT senses ; // Sinne VAR INT senses_range ; // Reichweite der Sinne in cm // ********************** // Feel free to use // ********************** // FIXME: TODO: bei goldmaster auf das benötigte minimum reduzieren VAR INT aivar [100] ; VAR STRING wp ; // ********************** // Experience dependant // ********************** VAR INT exp ; // EXerience Points VAR INT exp_next ; // EXerience Points needed to advance to next level VAR INT lp ;       // Learn Points   // If this is set to TRUE, the Npc can't be interrupted in any action (e.g. BS_FLAG_INTERRUPTABLE for anis is being ignored) VAR INT bodyStateInterruptableOverride ; // if "noFocus" is set to TRUE, the focus name and health bar will not be drawn of this nsc (hi, stefan!) var int     noFocus; };                      

eto

eto

Użytkownicy
-Banany pod pokładem? -SĄĄĄĄĄĄ
posty1741
Propsy1793
ProfesjaLvl designer
  • Użytkownicy
  • -Banany pod pokładem? -SĄĄĄĄĄĄ
a dlaczego zło i co to w ogole
 
Niespełniony Level Designer z ambicjami, zmęczeniem i brakiem czasu...

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
Bo klasa jest zdefiniowana w silniku, to co jest w skryptach to "szablon" jak dane ze skryptów mają być dopasowywane do tych w silniku. Gdybyś zmienił coś w klasie skryptowej, nie pasowałoby to do silnikowej, raz że nie byłoby to w żaden sposób interpretowane, a dwa że w ogóle chyba nie byłoby na to pamięci. Szczegóły techniczne mógłby dokładniej objaśnić Monk.

kaczka

kaczka

RaveN Studio
Definitely not kaczka!
posty2280
Propsy2392
NagrodyV
ProfesjaLvl designer
  • RaveN Studio
  • Definitely not kaczka!

kaczka
RaveN Studio

Class - size not compatible : C_NPC
#5 2012-01-31, 11:26(Ostatnia zmiana: 2012-01-31, 11:27)
Spoiler
//////////////////////////////////////
// Class - Definitions
// Global Instances
// Phoenix V0.76
//////////////////////////////////////

CONST INT MAX_CHAPTER     = 5;
CONST INT MAX_MISSIONS   = 5;
const int MAX_HITCHANCE  = 5;

CLASS C_NPC
{
VAR INT id ; // absolute ID des NPCs
VAR STRING name [5] ; // Namen des NPC
VAR STRING slot ;
VAR STRING effect;
VAR INT npcType ;
VAR INT flags ;
VAR INT attribute [ATR_INDEX_MAX] ;
var int HitChance [MAX_HITCHANCE] ;
VAR INT protection [PROT_INDEX_MAX];
VAR INT damage [DAM_INDEX_MAX] ;
VAR INT damagetype ;
VAR INT guild,level ;

VAR FUNC mission [MAX_MISSIONS] ;
var INT fight_tactic ;
VAR INT weapon ;

VAR INT voice ;
VAR INT voicePitch ;
VAR INT bodymass ;

VAR FUNC daily_routine ; // Tagesablauf
VAR FUNC start_aistate ; // Zustandsgesteuert

// **********************
// Spawn
// **********************
VAR STRING spawnPoint ; // Beim Tod, wo respawnen ?
VAR INT spawnDelay ; // Mit Delay in (Echtzeit)-Sekunden

// **********************
// SENSES
// **********************
VAR INT senses ; // Sinne
VAR INT senses_range ; // Reichweite der Sinne in cm

// **********************
// Feel free to use
// **********************
// FIXME: TODO: bei goldmaster auf das benötigte minimum reduzieren
VAR INT aivar [100] ;
VAR STRING wp ;

// **********************
// Experience dependant
// **********************
VAR INT exp ; // EXerience Points
VAR INT exp_next ; // EXerience Points needed to advance to next level
VAR INT lp ;   // Learn Points

// If this is set to TRUE, the Npc can't be interrupted in any action (e.g. BS_FLAG_INTERRUPTABLE for anis is being ignored)
VAR INT bodyStateInterruptableOverride ;
// if "noFocus" is set to TRUE, the focus name and health bar will not be drawn of this nsc (hi, stefan!)
var int noFocus;
};

CLASS C_Mission
{
VAR STRING name ; // Name des Auftrages
VAR STRING description ;
VAR INT duration ; // Max. Dauer in Tageszeiten
VAR INT important ;

VAR FUNC offerConditions ;
VAR FUNC offer ;
VAR FUNC successConditions ;
VAR FUNC success ;
VAR FUNC failureConditions ;
VAR FUNC failure ;
VAR FUNC obsoleteConditions ;
VAR FUNC obsolete ;
VAR FUNC running ;
};

CLASS C_Item
{
// Für alle Items
VAR INT id ;
VAR STRING  name,nameID ;
VAR INT hp,hp_max ;

VAR INT mainflag,flags ; // Hauptflag und weitere Flags
VAR INT weight,value ;

// Für Waffen
VAR INT damageType ; // Welche Schadensarten
VAR INT damageTotal ;
VAR INT damage [DAM_INDEX_MAX] ;

// Für Rüstungen
VAR INT wear ;
VAR INT protection [PROT_INDEX_MAX];

// Für Nahrung
VAR INT nutrition ; // HP-Steigerung bei Nahrung

// Benötigte Attribute zum Benutzen des Items
VAR INT cond_atr [3] ;
VAR INT cond_value [3] ;

// Attribute, die bei anlegen des Items verändert werden
VAR INT change_atr [3] ;
VAR INT change_value [3] ;

// Parserfunktionen
VAR FUNC magic ; // Parserfunktion zum "Magie Header"
VAR FUNC on_equip ; // Parserfunktion, wenn Item equipped wird.
VAR FUNC on_unequip ; // Parserfunktion, wenn Item unequipped wird.
VAR FUNC on_state [4] ;

// Besitzer
VAR FUNC owner ; // Besitzer : Instanz-Name
VAR INT ownerGuild ; // Besitzer : Gilde
VAR INT disguiseGuild ; // Zur Schau getragene Gilde durch Verkleidung

// Die 3DS-Datei
VAR STRING visual ;

// Veränderung des NSC-Meshes beim Anlegen dieses Gegenstandes
VAR STRING  visual_change ; // ASC - File
VAR STRING  effect; // Effekt Instanz

VAR INT visual_skin ;

VAR STRING scemeName ;
VAR INT material ;
// VAR STRING pfx ; // Magic Weapon PFX
VAR INT munition ; // Instance of Munition

var int spell ;
var int range ;

var int mag_circle ;

VAR STRING description ;
VAR STRING text [ITM_TEXT_MAX] ;
VAR INT count [ITM_TEXT_MAX] ;

// inventory darstellungs geschichten, wird nur benutzt, falls von 0 abweichend
var int inv_zbias; //  wie weit ist das item im inventory richtung far plane verschoben (integer scale 100=1)
var int inv_rotx; //  wieviel grad um die x achse ist das item im inv gedreht
var int inv_roty; //  wieviel grad um die y achse ist das item im inv gedreht
var int inv_rotz; //  wieviel grad um die z achse ist das item im inv gedreht
var int inv_animate; //  soll das item in inv rotiert werden
};

CLASS C_Focus
{
/// für NSCs
VAR FLOAT npc_longrange ; // Zurufweite ( 20 m )
VAR FLOAT npc_range1, npc_range2 ; // Reichweite
VAR FLOAT npc_azi ; // Azimuth ( Seitenwinkel )
VAR FLOAT npc_elevdo, npc_elevup ; // Elevation ( Höhenwinkel  )
VAR INT npc_prio ; // Priorität

/// für ITEMs
VAR FLOAT item_range1, item_range2 ; // Reichweite
VAR FLOAT item_azi ; // Azimuth ( Seitenwinkel )
VAR FLOAT item_elevdo, item_elevup ; // Elevation ( Höhenwinkel  )
VAR INT item_prio ; // Priorität

/// für MOBs
VAR FLOAT mob_range1, mob_range2 ; // Reichweite
VAR FLOAT mob_azi ; // Azimuth ( Seitenwinkel )
VAR FLOAT mob_elevdo, mob_elevup ; // Elevation ( Höhenwinkel  )
VAR INT mob_prio ; // Priorität
};

CLASS C_INFO
{
VAR INT npc ;
VAR INT nr ;
VAR INT important ; // Wichtig Flag -> ansprechen
VAR FUNC condition ;
VAR FUNC information ;  
VAR STRING description ;
VAR INT trade ;
VAR INT permanent ;
};

CLASS C_ITEMREACT
{
VAR INT npc;
VAR INT trade_item;
VAR INT trade_amount;
VAR INT requested_cat;
VAR INT requested_item;
VAR INT requested_amount;
VAR FUNC reaction;
};

CLASS C_Spell
{
VAR FLOAT time_per_mana; // Zeit pro investierten Manapunkt (ms)
VAR INT damage_per_level; // Schaden pro Level
VAR INT damageType; // CAN BE ONLY ONE DAMAGE TYPE
VAR INT spellType; // Good, Neutral or Bad
VAR INT canTurnDuringInvest;
VAR INT canChangeTargetDuringInvest;
VAR INT isMultiEffect; // Effect Class is oCVisFX_MultiTarget if set to 1 (e.g. the effect can have multiple trajectorys (massdeath)
VAR INT targetCollectAlgo;
VAR INT targetCollectType;
VAR INT targetCollectRange;
VAR INT targetCollectAzi;
VAR INT targetCollectElev;
};


// ************************************************************
// Globale Klasseninstanzen
// ************************************************************

// Aktueller Npc und der SC
INSTANCE self,other (C_NPC);

// Opfer bei "witness"-Aktionen
INSTANCE victim(C_NPC);

// aktuelles Item
INSTANCE item(C_Item);

// Und der Player immer als globale Instanz
INSTANCE hero(C_NPC);

Tutaj imo jest wszystko ok, ale mogło mi coś umknąć. Classes.d - dla niewtajemniczonych.
 

Demonical Monk

Demonical Monk

Użytkownicy
posty145
Propsy152
  • Użytkownicy
Przejrzyj wszystkie consty, które są tu używane. To też może wpłynąć na rozmiar klasy.
Szczególnie te:
ATR_INDEX_MAX
DAM_INDEX_MAX
PROT_INDEX_MAX
ITM_TEXT_MAX
Prawdopodobnie któryś const podkręciłeś o 2, doszły dwa 32 bitowe inty i rozmiar przestał się zgadzać.

Czemu kompilator tak pedantycznie do tego podchodzi? Bo w praktyce te natywne klasy to czyste "mięcho" - dane wrzucone na chama do pamięci. Zwykle gra spisuje sobie adres początku obiektu w pamięci (offset symbolu) tam, gdzie zaczyna się pierwsze pole i interpretuje.

Chcesz odczytać `npcType`? No to liczymy: `id` ma 4 bajty, `name` ma 4*5 bajtów (bo tablica pointerów), `slot` ma 4 bajty, `effect` ma 4 bajty. Po tych prymitywnych wyliczankach wiemy, że `npcType` znajduje się 4+4*5+4+4=32 bajty licząc od początku obiektu w pamięci. Dorzucisz dodatkowe pola, to silnik nie będzie wiedział jak to ugryźć i po prostu się zdenerwuje :P
 

kaczka

kaczka

RaveN Studio
Definitely not kaczka!
posty2280
Propsy2392
NagrodyV
ProfesjaLvl designer
  • RaveN Studio
  • Definitely not kaczka!

kaczka
RaveN Studio

Class - size not compatible : C_NPC
#7 2012-01-31, 22:34(Ostatnia zmiana: 2012-01-31, 23:57)
Przejrzyj wszystkie consty, które są tu używane. To też może wpłynąć na rozmiar klasy.
Szczególnie te:
ATR_INDEX_MAX
DAM_INDEX_MAX
PROT_INDEX_MAX
ITM_TEXT_MAX
Prawdopodobnie któryś const podkręciłeś o 2, doszły dwa 32 bitowe inty i rozmiar przestał się zgadzać.
Z tego co pamiętam to ATR

Czemu  kompilator tak pedantycznie do tego podchodzi? Bo w praktyce te natywne  klasy to czyste "mięcho" - dane wrzucone na chama do pamięci. Zwykle  gra spisuje sobie adres początku obiektu w pamięci (offset symbolu) tam,  gdzie zaczyna się pierwsze pole i interpretuje.

Chcesz odczytać  `npcType`? No to liczymy: `id` ma 4 bajty, `name` ma 4*5 bajtów (bo  tablica pointerów), `slot` ma 4 bajty, `effect` ma 4 bajty. Po tych  prymitywnych wyliczankach wiemy, że `npcType` znajduje się 4+4*5+4+4=32  bajty licząc od początku obiektu w pamięci. Dorzucisz dodatkowe pola, to  silnik nie będzie wiedział jak to ugryźć i po prostu się zdenerwuje :P
Powoli zaczynam rozumieć ten Twój strasznie poważny język. Za około 30 minut będę w stanie sprawdzić czy to faktycznie wina rozmiaru w const bo prawdą jest, że dodałem akurat 2 inty ;p

EDIT:
To co mówiłeś się zgadza. Jak mniemam chodzi teraz tylko jeszcze o plik AI_Constants.d. Wszystkie pliki, jakbym nie chciał i nie fisiował zawsze zawiną kółko do tego jednego... został mi błąd tylko tu.
Zakrywając parserowi linię
const int REAL_STAMINA_MAX = 88;( próbowałem też tym sposobem)
const int REAL_A     = 83;
const int REAL_A+B     = 1;

podaję mu na tacy nowe błędy, m.in w pliku B_RaiseAttribute.d
REAL_STAMINA_MAX - UKN. ID
Błędne koło jak dla mnie. Jedyne co muszę zrobić to znaleźć sposób na to, żeby do AI_Const wcisnąć jakoś tego REALa dodatkowego.
 

Demonical Monk

Demonical Monk

Użytkownicy
posty145
Propsy152
  • Użytkownicy
Chodziło mi o consty, które są w definicji C_NPC używane do określania rozmiarów tych tablic. Żadne inne stałe raczej się tutaj nie przydadzą i nie mają nic do tego. Weź sobie oryginalną paczkę skryptów i porównaj wartości constów, które powyżej wypisałem z wartościami u Ciebie.
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator

inż. Avallach
Administrator

Class - size not compatible : C_NPC
#9 2012-02-01, 07:03(Ostatnia zmiana: 2012-02-01, 07:04)
const int       REAL_A+B        = 1;Jeśli parser zaakceptował taką nazwę zmiennej to zadziwiłeś mnie prawie jak Monk z także działającym ":topi`321r4,234,123l123`1232;13p3p123c" (w PDO).

Chodzi ci o AI_Constants.d? Dlaczego chcesz dawać tą swoją zmienną akurat tam?

kaczka

kaczka

RaveN Studio
Definitely not kaczka!
posty2280
Propsy2392
NagrodyV
ProfesjaLvl designer
  • RaveN Studio
  • Definitely not kaczka!

kaczka
RaveN Studio

Class - size not compatible : C_NPC
#10 2012-02-01, 11:10(Ostatnia zmiana: 2012-02-01, 17:16)
const int   REAL_A+B        = 1;
To był tylko przykład. Z tego co wiem ( a jestem już coraz bliżej przekonania, że raczej nic nie wiem ;x) to brakuje mi tylko takiej (lub podobnej) zmiennej tam, żeby połączyć z tymi wszystkimi innymi plikami swój nowy atrybut - w tym wypadku wytrzymałość.
 


kaczka

kaczka

RaveN Studio
Definitely not kaczka!
posty2280
Propsy2392
NagrodyV
ProfesjaLvl designer
  • RaveN Studio
  • Definitely not kaczka!
Poprawione. Swoją drogą sam nie wiem dlaczego tak dziwnie to napisałem ;x
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
Dalej nie rozumiem, konkretnie tego:
Cytuj
brakuje mi tylko takiej (lub podobnej) zmiennej tam
Tam - gdzie? W AI_Constans.d? Dlaczego akurat tam? Przecież w przypadku zmiennych globalnych nie ma znaczenia w jakim dokładnie pliku je umieścisz, byleby kolejność parsowania się zgadzała.
Cytuj
żeby połączyć z tymi wszystkimi innymi plikami
?!? (jakie łączenie z innymi plikami, ocb?)
Cytuj
swój nowy atrybut - w tym wypadku wytrzymałość.
O, to zrozumiałem :D

kaczka

kaczka

RaveN Studio
Definitely not kaczka!
posty2280
Propsy2392
NagrodyV
ProfesjaLvl designer
  • RaveN Studio
  • Definitely not kaczka!
Cytuj
swój nowy atrybut - w tym wypadku wytrzymałość.
O, to zrozumiałem :D
Aleś Ty mądry :lol2:

Chodzi mi o to, że chcę zrobić nowy atrybut, ale po wielu nieudanych próbach tworzenia go stwierdzam, że nie mam zielonego pojęcia, jak mam to zrobić. Prościej się już nie da. :D
 

Demonical Monk

Demonical Monk

Użytkownicy
posty145
Propsy152
  • Użytkownicy
No i właśnie tam pewnie popsułeś. Podkręciłeś zapewne ATR_INDEX_MAX, żeby uzyskać więcej miejsc w tablicy, toteż cała klasa podrosła o 8 bajtów i przestała być kompatybilna.
 

kaczka

kaczka

RaveN Studio
Definitely not kaczka!
posty2280
Propsy2392
NagrodyV
ProfesjaLvl designer
  • RaveN Studio
  • Definitely not kaczka!

kaczka
RaveN Studio

Class - size not compatible : C_NPC
#16 2012-02-01, 23:50(Ostatnia zmiana: 2012-02-01, 23:57)
Zatem jak zrobić to mam myślicielu? Wdzięczny będę jak radą uraczysz swą mnie...(Wkręcam się w klimaty jedi)

EDIT:
ATR_INDEX_MAX zmieniłem z powrotem na 8 z tym, że teraz oczywistym będzie wywalanie Unknown identifier
 

Demonical Monk

Demonical Monk

Użytkownicy
posty145
Propsy152
  • Użytkownicy
Wejdź do _Work\Data\Scripts\Content\_intern, otwórz Constants.d i pokaż linijkę:
const int ATR_INDEX_MAX =  <wartość>
EDIT: No i o to chodzi. Nie możesz rozszerzyć żadnej tablicy wchodzącej w skład C_NPC, bo przestanie się zgadzać z wersją tej klasy w silniku. Musisz wymyślić inną metodę, bo się za cholerę nie skompiluje.
 

kaczka

kaczka

RaveN Studio
Definitely not kaczka!
posty2280
Propsy2392
NagrodyV
ProfesjaLvl designer
  • RaveN Studio
  • Definitely not kaczka!
Ogólnie to wygląda to tak
const int ATR_INDEX_MAX =  8;a przez to moje kombinowanie, tak
const int ATR_INDEX_MAX =  10;
Dalej - powinno być tak
const int ATR_HITPOINTS =  0; // Lebenspunkte
const int ATR_HITPOINTS_MAX =  1; // Max. Lebenspunkte
const int ATR_MANA =  2; // Mana Mana
const int ATR_MANA_MAX =  3; // Mana Max

const int ATR_STRENGTH =  4; // Stärke
const int ATR_DEXTERITY =  5; // Geschick
const int ATR_HP_REG =  6; // Regenerierung von HP alle x sekunden
const int ATR_MANA_REG =  7;   // Regenerierung von Mana alle x sekunden

const int ATR_INDEX_MAX =  8;
a jest tak
const int ATR_HITPOINTS =  0; // Lebenspunkte
const int ATR_HITPOINTS_MAX =  1; // Max. Lebenspunkte
const int ATR_MANA =  2; // Mana Mana
const int ATR_MANA_MAX =  3; // Mana Max

const int ATR_STRENGTH =  4; // Stärke
const int ATR_DEXTERITY =  5; // Geschick
const int ATR_HP_REG =  6; // Regenerierung von HP alle x sekunden
const int ATR_MANA_REG =  7;   // Regenerierung von Mana alle x sekunden

const int ATR_STAMINA =  8;   // Staminapunkte
const int ATR_STAMINA_MAX =  9;   // Max. Staminapunkte

const int ATR_INDEX_MAX =  10;
 

Sawik

Sawik

Moderator działu
Rebel
posty4772
Propsy3197
ProfesjaNierób
  • Moderator działu
  • Rebel
Kaczka dodając dwa inty dodajesz 2x4 bajty (jeden int zajmuje cztery bajty) przez co rozmiar klasy się nie zgadza. Musisz to zmienić by przywrócić porządek w grze. Wiem że to rozumiesz i nie wiem czemu się z tym jeszcze męczysz, rozwiązanie jakie zastosowałem działa i chyba wystarcza jak na razie potem będę nad tym jeszcze pracował.
 
Życzę wam seksu analnego po stronie biernej.
Dropbox +500 mb na start
LowPoly
Wykonanie modelu niskopoligonowego to sztuka kompromisu. Nie jest to jedynie uproszczenie modelu wysokopoligonowego, ale głęboka modyfikacja oraz podejmowanie decyzji często zmieniających wygląd pierwotny obiektu, tak by przy najmniejszej ilości trójkątów uzyskać jak najwierniej odwzorowany kształt oryginału. Nie można też zapomnieć o tym iż musi nadal wyglądać przekonywająco i tak balansować by uzyskać efekt optymalny.

Podstawowym założeniem jest, że model nie powinien mieć zbędnych, niewidocznych dla gracza detali włączonych w geometrie. Większość obiektów jakie znajdują się w grze powinna prezentować się najlepiej z odległości około 3-5 metrów. Wszelkie detale, które zanikają, wydają się płaskie lub zlewają się z bryłą modelu należy uznać za zbędne i pozostawić je na normal mapie.

Fakt, iż gracz będzie w stanie podejść bliżej do obiektu i zobaczyć go z mniejszej niż 3m odległości nie powinno stanowić większego problemu, gdyż większą rolę odgrywają wtedy tekstury oraz dodatkowy detal zależny od materiału obiektu. To właśnie kompromis między wydajnością, a szczegółowością otoczenia.

Detal, którego nie widać z 3-5 metrów nie powinnien istnieć w geometrii modelu.
Krawędzie znajdujące się blisko siebie, które zlewają się z większej odległości należy uprościć do wspólnej płaszczyzny


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry