Как инвертировать нормали в maya

Вывернутые нормали

Как инвертировать нормали в maya. 5ad9f8a571bdf. Как инвертировать нормали в maya фото. Как инвертировать нормали в maya-5ad9f8a571bdf. картинка Как инвертировать нормали в maya. картинка 5ad9f8a571bdf

Как инвертировать нормали в maya. 5ad9f8a571bdf. Как инвертировать нормали в maya фото. Как инвертировать нормали в maya-5ad9f8a571bdf. картинка Как инвертировать нормали в maya. картинка 5ad9f8a571bdf

а как проверить то? Где вывернуты, а где нет?

Как инвертировать нормали в maya. 59b3ade58b1c4. Как инвертировать нормали в maya фото. Как инвертировать нормали в maya-59b3ade58b1c4. картинка Как инвертировать нормали в maya. картинка 59b3ade58b1c4

Как инвертировать нормали в maya. 567ebe42a0cf9. Как инвертировать нормали в maya фото. Как инвертировать нормали в maya-567ebe42a0cf9. картинка Как инвертировать нормали в maya. картинка 567ebe42a0cf9

Как инвертировать нормали в maya. 5b6d413c08b4a. Как инвертировать нормали в maya фото. Как инвертировать нормали в maya-5b6d413c08b4a. картинка Как инвертировать нормали в maya. картинка 5b6d413c08b4a

Как инвертировать нормали в maya. 5ad9f8a571bdf. Как инвертировать нормали в maya фото. Как инвертировать нормали в maya-5ad9f8a571bdf. картинка Как инвертировать нормали в maya. картинка 5ad9f8a571bdf

Ваш способ суперский, сразу нашёл косяк ))

Как инвертировать нормали в maya. 5b84588ca4e84. Как инвертировать нормали в maya фото. Как инвертировать нормали в maya-5b84588ca4e84. картинка Как инвертировать нормали в maya. картинка 5b84588ca4e84

выделяете объект кликаете [Click Here To Update]

зелёным окрашиваются ваши ненормальные нормали))

Как инвертировать нормали в maya. 5baef4a9427e7. Как инвертировать нормали в maya фото. Как инвертировать нормали в maya-5baef4a9427e7. картинка Как инвертировать нормали в maya. картинка 5baef4a9427e7

выделяете объект кликаете [Click Here To Update]

зелёным окрашиваются ваши ненормальные нормали))

круто, детачнул полигон. Зелёный весь. Флип-другая сторона зеленая стала. И весь объект так. И Cut только по изнанке привязывается.

Как инвертировать нормали в maya. 5959463472e28. Как инвертировать нормали в maya фото. Как инвертировать нормали в maya-5959463472e28. картинка Как инвертировать нормали в maya. картинка 5959463472e28

Как инвертировать нормали в maya. 5b758b0661b53. Как инвертировать нормали в maya фото. Как инвертировать нормали в maya-5b758b0661b53. картинка Как инвертировать нормали в maya. картинка 5b758b0661b53

Можно конвертнуть в Mesh, там жмете галку Edit normals, и синенькие палочки показывают в какую сторону развернуты нормали. Использовать _Flip_ либо модификатор Normal для исправления)

Источник

Отображение направления нормалей в Maya

Если вам нужно отобразить направление нормалей на сцене у полигонального объекта, то сделать это можно, используя главное меню или функционал свойств объекта. Выделяем объект и с помощью набора команд Ctrl+A переходим в редактор. Вторая вкладка отвечает за изменение отображения объекта, ее название оканчивается словом Shape. Далее мы переходим в свиток Mesh Component Display и активируем опцию Display Normal.

Как инвертировать нормали в maya. 8.1. Как инвертировать нормали в maya фото. Как инвертировать нормали в maya-8.1. картинка Как инвертировать нормали в maya. картинка 8.1

Видим, что на сцене выделенного полигонального объекта отображаются нормали.

Как инвертировать нормали в maya. 8.2. Как инвертировать нормали в maya фото. Как инвертировать нормали в maya-8.2. картинка Как инвертировать нормали в maya. картинка 8.2

Параметр Normal Size определяет размер нормалей. Их отображение является не глобальным параметром. Его можно активировать исключительно для полигонального объекта. Если же вам нужно перевернуть нормаль у полигона или вывернуть полигоны на всем объекте, то нужно выбрать пункт Normals, затем – Reverse. Эти команды находятся в меню Polygons.

Также можно приводить нормали в действие через функционал главного окна. Для этого мы его выделяем и выбираем последовательность действий: Display – Polygons – Face Normal.

Уважаемые пользователи, хотим Вас проинформировать о том, что некоторые антивирусные программы и браузеры ложно срабатывают на дистрибутив программы MediaGet, считая его зараженным. Данный софт не содержит никаких вредоносных программ и вирусов и многие из антивирусов просто Вас предупреждают, что это загрузчик (Downloader). Если хотите избежать подобных проблем, просто добавьте MediaGet в список доверенных программ Вашей антивирусной программы или браузера.

Как инвертировать нормали в maya. 1. Как инвертировать нормали в maya фото. Как инвертировать нормали в maya-1. картинка Как инвертировать нормали в maya. картинка 1

Выбрав нужную версию программы и кликнув ссылку, Вам на компьютер скачивается дистрибутив приложения MediaGet, который будет находиться в папке «Загрузки» для Вашего браузера. Находим этот файл с именем программы и запускаем его. И видим первый этап установки. Нажимаем унопку «Далее»

Как инвертировать нормали в maya. 2. Как инвертировать нормали в maya фото. Как инвертировать нормали в maya-2. картинка Как инвертировать нормали в maya. картинка 2

Далее Вам предлагается прочитать и одобрить лицензионное соглашение. Нажимаем кнопку «Принимаю»

Как инвертировать нормали в maya. 3. Как инвертировать нормали в maya фото. Как инвертировать нормали в maya-3. картинка Как инвертировать нормали в maya. картинка 3

В следующем окне Вам предлагается бесплатное полезное дополнительное программоное обеспечение, будь то антивирус или бразуер. Нажимаем кнопку «Принимаю». Также Вы можете отказаться от установки дополнительного ПО, нажав кнопку «Отклоняю»

Как инвертировать нормали в maya. 4. Как инвертировать нормали в maya фото. Как инвертировать нормали в maya-4. картинка Как инвертировать нормали в maya. картинка 4

Далее происходит процесс установки программы. Вам нужно выбрать папку, в которую будут скачиваться нужные Вам файлы.

Как инвертировать нормали в maya. 5. Как инвертировать нормали в maya фото. Как инвертировать нормали в maya-5. картинка Как инвертировать нормали в maya. картинка 5

Происходит завершение установки. Программа автоматически открывается и скачивает нужные Вам исходные файлы.

Обратите внимание, что предоставляемое программное обеспечение выкладывается исключительно для личного использования и ознакомления. Все файлы, доступные для скачивания, не содержат вирусов и вредоносных программ.

Источник

Как вывернуть нормали наружу у сотен объектов с поразному вывернутыми нормалями?

Germanager

Знаток

Bipper

Активный участник

Как инвертировать нормали в maya. 25551. Как инвертировать нормали в maya фото. Как инвертировать нормали в maya-25551. картинка Как инвертировать нормали в maya. картинка 25551

Дмитрий damat Астапкович

Знаток

Ладага

Активный участник

Ладага

Активный участник

А вообще!Встречаются курьёзы в этой жизни что без нормальных нормалей и нет собсно жизни!Прошу прощение за каламбур.Это любовь к майке и снова блэндер.Курьёз вот в чём.Если к этим привязать кэш то тут нашлось решение http://tea3d.blogspot.gr/ а,то что на creative crash пишут там какие то ошибки типа в винде не грузит,так у меня всё работает берём этот код и вставляем в script editote где Python и жмяк на exekute(такой треугольничег похож на значёк плэй в скрипт эдиторе)

»’
Author: Alex Manita
Description: This tool designed primarily for export meshes and particles out of maya,
so they could be imported later into Houdini and other packages
Usage:

import fx_mdd_obj_exporter
fx_mdd_obj_exporter.runUI()

License: You can use it everywhere and modify but you cant sell it.
Use and Modify it at your own risk with absolutelly no warranties.

from struct import pack
import maya.OpenMaya as OpenMaya
import maya.cmds as cmds
import os,re

def zero_file(filepath):
»’
If a file fails, this replaces it with 1 char, better not remove it?
»’
file = open(filepath, ‘w’)
file.write(‘\n’) # aparently macosx needs some data in a blank file?
file.close()

def check_vertcount(exportedObjects,vertcount,mddFile):
»’
check and make sure the vertcount is consistent throghout the frame range
»’
totalCount = 0
for each in exportedObjects:
currentObject = nameToNode(each[1])

def getVertexCount(objects):
numverts = 0
for object in objects:
exportedObjectShape = object[1]
# Convert the string name to an actual object
mesh_orig = nameToNode(exportedObjectShape)
#We should get reference frame from start frame
# Create the vertex iterator with that object
objectSurfaceIt = OpenMaya.MItMeshVertex(mesh_orig)
# Get number of vertices
numverts += objectSurfaceIt.count()
return numverts

def nameToNode( name ):
selectionList = OpenMaya.MSelectionList()
selectionList.add( name )
node = OpenMaya.MObject()
selectionList.getDependNode( 0, node )
return node

#Return the list of CV positions
return vertexPositionList

def getObjectTransform(exportedObjectTransform):
mat_flip = OpenMaya.MMatrix()
mat_flip_list = [1.0, 0.0, 0.0, 0.0,0.0, 1.0, 0.0, 0.0,0.0, 0.0, 1.0, 0.0,0.0, 0.0, 0.0, 1.0]
worldMatrixList = cmds.getAttr(‘%s.worldMatrix’%exportedObjectTransform)
# Convert list to MMatrix object
temp_mMatrix = OpenMaya.MMatrix()
OpenMaya.MScriptUtil.createMatrixFromList(worldMatrixList, temp_mMatrix)
transform = temp_mMatrix * mat_flip
return transform

# exportedObjects have format [(transformNode, objectShape). ]
def mddExport(filepath, exportedObjects, startFrame, endFrame, fps):
(difName,basename) = getDirFromParh(filepath)
filepath = difName+»/»+basename+».mdd»
filepathObj = difName+»/»+basename+».obj»

mddFile = open(filepath, ‘wb’) #no Errors yet:Safe to create file
numframes = endFrame-startFrame+1
# set reference frame time
cmds.currentTime( startFrame, edit=True )
cmds.file(filepathObj,op=»groups=1;ptgroups=1;materials=0;smoothing=1;normals=1″,typ=»OBJexport»,pr=1,es=1,force=1)

# Write the header
numverts = getVertexCount(exportedObjects)
mddFile.write(pack(«>2i», numframes, numverts))

## Write the frame times, sec
mddFile.write( pack(«>%df» % (numframes), *[frame/fps for frame in xrange(numframes)]) ) # seconds
#checking vertex count for the model
check_vertcount(exportedObjects,numverts,mddFile)

for frame in range(startFrame,endFrame,inc):
if cmds.progressWindow( query=True, isCancelled=True ) :
break
cmds.currentTime( frame, edit=True )
cmds.file(difName+»/»+basename+».»+str(frame).zfill(5)+».obj»,op=»groups=1;ptgroups=1;materials=0;smoothing=1;normals=1″,typ=»OBJexport»,pr=1,es=1,force=1)
if cmds.progressWindow( query=True, progress=True ) >= frameRange :
break
amount += 1
cmds.progressWindow( edit=True, progress=amount, status=(‘Finished: ‘ + `amount` + ‘%’ ) )
cmds.progressWindow(endProgress=1)

def particleExport(filepath, startFrame, endFrame, inc,particleTuple, userveca=»»,uservecb=»»,userfloa=»»,userflob=»»):
pTransform = particleTuple[0]
pshape = particleTuple[1]
if cmds.objectType( pshape ) == «particle» or cmds.objectType( pshape ) == «nParticle»:
cmds.runup( maxFrame=startFrame)

arad=1 if cmds.objExists(pshape+».radiusPP») else 0
arot=1 if cmds.objExists(pshape+».rot») else 0
avel=1 if cmds.objExists(pshape+».velocity») else 0
aid=1 if cmds.objExists(pshape+».id») else 0
alife=1 if cmds.objExists(pshape+».lifespanPP») else 0
aage=1 if cmds.objExists(pshape+».age») else 0
argb=1 if cmds.objExists(pshape+».rgbPP») else 0
aopacity=1 if cmds.objExists(pshape+».opacityPP») else 0
amass=1 if cmds.objExists(pshape+».mass») else 0
auserveca=1 if cmds.objExists(pshape+».»+userveca) else 0
auservecb=1 if cmds.objExists(pshape+».»+uservecb) else 0
auserfloa=1 if cmds.objExists(pshape+».»+userfloa) else 0
auserflob=1 if cmds.objExists(pshape+».»+userflob) else 0
attrNum = arad + arot + avel + aid + alife + aage + argb + aopacity + amass + auserveca + auservecb + auserfloa + auserflob;

svel = «v 3 vector 0 0 0 \n» if avel else «»
srad = «pscale 1 float 1 \n» if arad else «»
srot = «rot 3 vector 0 0 0 \n» if arot else «»
sid = «id 1 float 1 \n» if aid else «»
slife = «life 1 float 1 \n» if alife else «»
sage = «age 1 float 1 \n» if aage else «»
srgb = «Cd 3 vector 0 0 0 \n» if argb else «»
sopacity = «opacity 1 float 1 \n» if aopacity else «»
smass = «mass 1 float 1 \n» if amass else «»
suserveca = (userveca +» 3 vector 0 0 0 \n») if auserveca else «»
suservecb = (uservecb +» 3 vector 0 0 0 \n») if auservecb else «»
suserfloa = (userfloa +» 1 float 1 \n») if auserfloa else «»
suserflob = (userflob +» 1 float 1 \n») if auserflob else «»
(difName,basename) = getDirFromParh(filepath)
particleCount = cmds.particle(pTransform,q=1, count=1)

for frame in xrange(startFrame,endFrame+1):#in order to start at desired frame
cmds.currentTime( frame, edit=True )
finalFilePath = difName+»/»+basename+».»+str(frame).zfill(5)+».geo»
particleFile = open(finalFilePath, ‘w’)

particleFile.write(«PGEOMETRY V5 \nNPoints » + str(cmds.particle(pTransform,q=1, count=1)) + » NPrims 0 \nNPointGroups 0 NPrimGroups 0 \nNPointAttrib «+str(attrNum)+» NVertexAttrib 0 NPrimAttrib 0 NAttrib 1 \nPointAttrib \n»+svel+srad+srot+sid+slife+sage+srgb+sopacity+smass+suserveca+suservecb+suserfloa+suserflob);

for fr in range(cmds.particle(pTransform,q=1, count=1)) :

posb = cmds.getParticleAttr(pshape+».pt»+»[«+str(fr)+»]»,attribute = ‘worldPosition’)
if avel:velb = cmds.getParticleAttr(pshape+».pt»+»[«+str(fr)+»]»,attribute = ‘velocity’)
if arad:scaleb = cmds.getParticleAttr(pshape+».pt»+»[«+str(fr)+»]»,attribute = ‘radiusPP’)
if arot:rotb = cmds.getParticleAttr(pshape+».pt»+»[«+str(fr)+»]»,attribute = ‘rot’)
if aid:idb = cmds.getParticleAttr(pshape+».pt»+»[«+str(fr)+»]»,attribute = ‘id’)
if alife:lifeb = cmds.getParticleAttr(pshape+».pt»+»[«+str(fr)+»]»,attribute = ‘lifespanPP’)
if aage:ageb = cmds.getParticleAttr(pshape+».pt»+»[«+str(fr)+»]»,attribute = ‘age’)
if argb:rgbb = cmds.getParticleAttr(pshape+».pt»+»[«+str(fr)+»]»,attribute = ‘rgbPP’)
if aopacity pacityb = cmds.getParticleAttr(pshape+».pt»+»[«+str(fr)+»]»,attribute = ‘opacityPP’)
if amass:massb = cmds.getParticleAttr(pshape+».pt»+»[«+str(fr)+»]»,attribute = ‘mass’)
if auserveca:uservecab = cmds.getParticleAttr(pshape+».pt»+»[«+str(fr)+»]»,attribute = userveca)
if auservecb:uservecbb = cmds.getParticleAttr(pshape+».pt»+»[«+str(fr)+»]»,attribute = uservecb)
if auserfloa:userfloab = cmds.getParticleAttr(pshape+».pt»+»[«+str(fr)+»]»,attribute = userfloa)
if auserflob:userflobb = cmds.getParticleAttr(pshape+».pt»+»[«+str(fr)+»]»,attribute = userflob)

fvel = str(velb[0]) +» «+ str(velb[1])+» «+str(velb[2])+» » if avel else «»
frad = str(scaleb[0])+» » if arad else «»

frot = str(rotb[0]) +» «+ str(rotb[1])+» «+str(rotb[2])+» » if arot else «»
fid = str(idb[0])+» » if aid else «»
flife = str(lifeb[0])+» » if alife else «»
fage = str(ageb[0])+» » if aage else «»
frgb = str(rgbb[0]) +» «+ str(rgbb[1])+» «+str(rgbb[2])+» » if argb else «»
fopacity = str(opacityb[0])+» » if aopacity else «»
fmass = str(massb[0])+» » if amass else «»
fuserveca = str(uservecab[0]) +» «+ str(uservecab[1])+» «+str(uservecab[2])+» » if auserveca else «»
fuservecb = str(uservecbb[0]) +» «+ str(uservecbb[1])+» «+str(uservecbb[2])+» » if auservecb else «»
fuserfloa = str(userfloab[0])+» » if auserfloa else «»
fuserflob = str(userflobb[0])+» » if auserflob else «»

Источник

Это норма — 4: решение проблем с картами нормалей

Как инвертировать нормали в maya. c0414c07c198aeaa0b580a88e67f66b3. Как инвертировать нормали в maya фото. Как инвертировать нормали в maya-c0414c07c198aeaa0b580a88e67f66b3. картинка Как инвертировать нормали в maya. картинка c0414c07c198aeaa0b580a88e67f66b3

Это четвёртая часть туториала о картах нормалей, но она независима от остальных частей и её можно читать отдельно.

Здесь я перечисляю проблемы карт нормалей, с которыми я сталкивался за годы работы, и некоторые решения, позволяющие их устранить.

Проблема: на рёбрах модели присутствуют «чёрные линии» или «вставки»

Как инвертировать нормали в maya. 3003c2fc07215c52e319e3354e391526. Как инвертировать нормали в maya фото. Как инвертировать нормали в maya-3003c2fc07215c52e319e3354e391526. картинка Как инвертировать нормали в maya. картинка 3003c2fc07215c52e319e3354e391526

Такое происходит, когда у модели есть резкие рёбра (hard edges), поскольку вершины модели имеют нормали, полностью перпендикулярные поверхности полигона, из-за чего программа запекания может пропустить некоторые детали (оставляя на модели чёрные линии).

Как инвертировать нормали в maya. 94f4ddda9c6073b147f8f35a7db1fc30. Как инвертировать нормали в maya фото. Как инвертировать нормали в maya-94f4ddda9c6073b147f8f35a7db1fc30. картинка Как инвертировать нормали в maya. картинка 94f4ddda9c6073b147f8f35a7db1fc30

Решение: программы запекания карт нормалей учитывают эту проблему при создании карт нормалей и пытаются снизить её влияние, вычисляя немного больше информации за нормалями вершин, но чтобы сохранить её, им нужен зазор между UV-развёртками полигонов.

Здесь есть более подробное объяснение, но на практике правило довольно простое: когда на модели есть резкое ребро, нужно отделять в UV соединённые им грани.

Проблема: карта нормалей выглядит СОВЕРШЕННО неправильно, особенно под некоторыми углами

Эта проблема может возникать по множеству причин. Давайте обсудим некоторые из них:

Как инвертировать нормали в maya. image loader. Как инвертировать нормали в maya фото. Как инвертировать нормали в maya-image loader. картинка Как инвертировать нормали в maya. картинка image loader

Также возможно, что вы используете в качестве карты нормалей касательного пространства карту нормалей мирового пространства. В таком случае убедитесь, что вы выполняете запекание карты нормалей касательного пространства, и используете её в этом качестве.

В таком случае сравните lowpoly в обоих приложениях и если они отличаются, то попробуйте изменить параметры импорта/экспорта, используемые форматы файлов (файлы obj теряют информацию о нормалях) и проверьте совместимость своей программы с настраиваемыми нормалями.

Проблема: как мне создать карту нормалей острого конуса?

Решение: вам это… не нужно. Не обязательно создавать карты нормалей для всего. Острый конус — классический пример этого, но существует множество других случаев, когда карты нормалей не являются решением.

Как инвертировать нормали в maya. effc592bc5b65c113db37e86eb26ee1a. Как инвертировать нормали в maya фото. Как инвертировать нормали в maya-effc592bc5b65c113db37e86eb26ee1a. картинка Как инвертировать нормали в maya. картинка effc592bc5b65c113db37e86eb26ee1a

Мы используем карты нормалей для изменения направления нормалей lowpoly-моделей. Иногда направление нормалей правильно и не требует никаких изменений, а иногда нормали lowpoly чрезвычайно повёрнуты (как в случае острого шипа) и детали из highpoly-модели неправильно сопоставляются с поверхностью lowpoly-модели. В таких случаях я просто удаляют детали карты нормалей при помощи такого цвета:

Как инвертировать нормали в maya. aa3a2b2f7c2948cbf626da237c3a2307. Как инвертировать нормали в maya фото. Как инвертировать нормали в maya-aa3a2b2f7c2948cbf626da237c3a2307. картинка Как инвертировать нормали в maya. картинка aa3a2b2f7c2948cbf626da237c3a2307

Этот цвет на 50% красный, на 50% зелёный и на 100% синий, и он не меняет направления нормалей карты нормалей касательного пространства, поэтому можно использовать его для удаления деталей в местах с неудачной проекцией.

Острый конус — это просто пример одного из случаев, когда карты нормалей могут не решить ваших проблем. Важно здесь помнить, что в некоторых случаях карта нормалей не является наилучшим решением, её возможности ограничены и мы не можем ожидать, что они будут вести себя так, как нам нужно, в любой ситуации. Иногда мы тратим много времени, пытаясь заставить работать карту нормалей, когда можно было бы просто добавить деталей в diffuse-текстуру или в lowpoly, а не пытаться передать деталь при помощи карты нормалей.

Проблема: детали на моей модели выглядят вывернутыми.

Это очень распространённая проблема, и её можно наблюдать во многих видеоиграх, даже AAA-уровня.

Как мы видели в этом туториале [перевод на Хабре], карты нормалей — это текстуры, использующие зелёный, красный и синий каналы для изменения способа отражения света от поверхности модели, когда он падает соответственно сбоку, сверху и спереди модели (помните, что это упрощённое объяснение и оно верно не на 100%).

Как инвертировать нормали в maya. 6931df95deb620abb8e75ca0932cfdad. Как инвертировать нормали в maya фото. Как инвертировать нормали в maya-6931df95deb620abb8e75ca0932cfdad. картинка Как инвертировать нормали в maya. картинка 6931df95deb620abb8e75ca0932cfdad

Проблема в том, что некоторые приложения считают, что зелёный канал должен показывать модель как освещённую снизу, а другие считают, что он должен показывать модель как освещённую сверху. Иногда это называют «правостороннесть карты нормалей» (normal map right-handiness):

Проблема: некоторые части кажутся плоскими/в них отсутствуют какие-то детали

Представьте, что при запекании карт нормалей программа запекания испускает лучи из поверхности lowpoly-модели, следуя по нормалям lowpoly, пока лучи не пересекутся с highpoly-моделью и не повернутся. После этого программа запекания берёт эту информацию и сохраняет её в карту нормалей.

Эти испущенные лучи не должны двигаться бесконечно, потому что могут столкнуться с далёкой частью highpoly и повернуться неправильно, поэтому программа запекания ограничивает дальность испускания лучей и иногда лучи могут останавливаться прежде, чем успеют пересечься с highpoly. В таком случае мы теряем детали и карта нормалей имеет области плоского цвета.

Как инвертировать нормали в maya. eebbe0bb7369dd4f9e184b96df91ccd3. Как инвертировать нормали в maya фото. Как инвертировать нормали в maya-eebbe0bb7369dd4f9e184b96df91ccd3. картинка Как инвертировать нормали в maya. картинка eebbe0bb7369dd4f9e184b96df91ccd3

Решение: зависит от того, как программа запекания позволяет управлять расстоянием запекания:

Проблема: карта нормалей имеет искажённые детали

Это очень типичная проблема. Такое происходит, когда нормали lowpoly неправильно соответствуют деталям highpoly, поэтому кажутся наклонёнными (на самом деле, если смотреть на них с направления нормалей вершин, они соответствуют идеально). Такое обычно происходит, когда некоторые грани образуют очень острый угол.

Как инвертировать нормали в maya. 1f450841ff63fc683594fc7cbd7418c1. Как инвертировать нормали в maya фото. Как инвертировать нормали в maya-1f450841ff63fc683594fc7cbd7418c1. картинка Как инвертировать нормали в maya. картинка 1f450841ff63fc683594fc7cbd7418c1

Решение: я более подробно писал об этой теме в другом туториале [перевод на Хабре], но в целом решения бывают такими:

Проблема: карта нормалей выглядит пикселизированной или содержит полосы

Earthquake (AKA бог карт нормалей) написал очень хорошее объяснение этой проблемы.

Если lowpoly и highpoly очень похожи, то бОльшая часть карты нормалей будет иметь один базовый цвет карты нормалей, а другими цвета будут в местах отличия lowpoly от highpoly.

Если ситуация обратная: lowpoly и highpoly очень отличаются, то карта нормалей будет иметь гораздо большее разнообразие цветов и начнут возникать градиенты:

Как инвертировать нормали в maya. 71f06901e389eabf5495de19c8bbf466. Как инвертировать нормали в maya фото. Как инвертировать нормали в maya-71f06901e389eabf5495de19c8bbf466. картинка Как инвертировать нормали в maya. картинка 71f06901e389eabf5495de19c8bbf466

Такие плавные градиенты вызывают проблемы, потому что для их представления нужно множество цветов, а самые распространённые способы сжатия текстур основаны на снижении общего количества цветов.

При наличии плавных градиентов мы можем замечать на модели полосы, потому что изображение не имеет достаточного количества цветов для представления такого небольшого изменения цвета.

Как инвертировать нормали в maya. 985d9c3028f9d9f27c58427ccfb61b06. Как инвертировать нормали в maya фото. Как инвертировать нормали в maya-985d9c3028f9d9f27c58427ccfb61b06. картинка Как инвертировать нормали в maya. картинка 985d9c3028f9d9f27c58427ccfb61b06

16-битные значения могут использовать 16 различных битовых значений на каждый канал, что составляет 65536 возможных цветов. Это означает, что диапазон плавных градиентом может быть больше. Учтите, что 16-битные изображения больше по размерам, чем 8-битные (потому что содержат больше информации). Кроме того, иногда 16-битные изображения содержат альфа-канал; тогда они называются 24-битными изображениями. [Прим. пер.: тут у автора очевидная ошибка.]

Как инвертировать нормали в maya. eab00e77cf6f8860a67e2444061f5b96. Как инвертировать нормали в maya фото. Как инвертировать нормали в maya-eab00e77cf6f8860a67e2444061f5b96. картинка Как инвертировать нормали в maya. картинка eab00e77cf6f8860a67e2444061f5b96

Проблема: на отдельных частях модели заметны пиксели

Очевидным решением будет увеличение UV-«острова» (island) этой части модели или использование более крупных текстур, но давайте рассмотрим и менее очевидные решения:

Как инвертировать нормали в maya. 6e360dd3e62c19b2ebc4c4f0ad51400f. Как инвертировать нормали в maya фото. Как инвертировать нормали в maya-6e360dd3e62c19b2ebc4c4f0ad51400f. картинка Как инвертировать нормали в maya. картинка 6e360dd3e62c19b2ebc4c4f0ad51400f

Как инвертировать нормали в maya. c4bd0b4fb52181f2f35d93276cd8af73. Как инвертировать нормали в maya фото. Как инвертировать нормали в maya-c4bd0b4fb52181f2f35d93276cd8af73. картинка Как инвертировать нормали в maya. картинка c4bd0b4fb52181f2f35d93276cd8af73

Как инвертировать нормали в maya. ef510c4dfe61c9d4abe6055d3c209017. Как инвертировать нормали в maya фото. Как инвертировать нормали в maya-ef510c4dfe61c9d4abe6055d3c209017. картинка Как инвертировать нормали в maya. картинка ef510c4dfe61c9d4abe6055d3c209017

Проблема: моя модель симметрична, но с разных сторон карта нормалей отличается.

При применении к модели симметрии направления нормалей могут измениться из-за того, что изменился способ соединения граней. Иногда это означает, что можно получить шов прямо по центру модели. Чтобы избежать этого, сделайте так, чтобы нормали lowpoly в самом центре были выровнены, и при необходимости настройте сглаживание.

Ещё одна возможная причина — триангуляция: при импорте моделей в игровой движок они всегда триангулируются и иногда этот процесс может изменить нормали lowpoly, а по диагоналям граней lowpoly могут появиться артефакты. Чтобы избежать этого, триангулируйте модель перед запеканием, запеките карту нормалей, а затем примените модификатор симметрии.

Кроме того, вы можете изучить небольшой туториал Earthquake, который помог мне немного больше понять нормали вершин и карты нормалей.

Дополнительную информацию о картах нормалей можно узнать из wiki сайта Polycount.

Источник

Normal Map. Практическое руководство

Введение

Данное руководство создано для тех, кто стремится понять тему Normal Mapping. Оно написано как для новых людей в индустрии, так и для более опытных, которые хотят освежить знания по теме. Здесь я постараюсь рассмотреть каждую возможную проблему и предоставить простой и доступный ответ. Надеюсь, что это руководство даст вам все необходимое о Normal Mapping и о том, как его применять. Проблемы с Normal Mapping не должны стоять на пути вашего творчества!

Отдельное спасибо EarthQuake с Polycount за вдохновение на создание этого гайда.

Условия использования

Пожалуйста, уважайте работу автора и не копируйте текст руководства никуда, кроме Polycount, без моего разрешения (Superfranky). Если вы увидели ошибку или хотите что-то добавить, то, пожалуйста, напишите мне на Polycount или отправьте письмо на networkcat2@hotmail.com.

Примечание

Перевод подготовлен специально для школы компьютерной графики XYZ. Некоторые главы, после согласования с автором, были расширены или обновлены для большей актуальности. Следовательно, некоторые части текста могут отсутствовать в оригинальном руководстве. По вопросам перевода пишите на nocstrig@yandex.ru. (Леонид Садеков)

Источники

Помимо оригинального руководства были использованы дополнительные источники информации:
A Practical Guide on Normal Mapping For Games:

You’re making me hard. Making sense of hard edges, uvs, normal maps and vertex counts:

Техническая информация

Normal Mapping – это технология, используемая для имитации неровностей поверхности на объекте. Она применяется, чтобы сделать вашу финальную модель более похожей на ее HP (High Poly) версию. С ее помощью можно добить различные детали, которые нельзя передать через геометрию из-за ограничений полигонажа на вашем проекте, и заставить вашу модель выглядеть более скругленной для лучшей передачи освещенности и большей реалистичности.

Карты нормалей – это RGB изображения, где каждый из каналов (красный, зелёный, синий) интерпретируется в X, Y и Z координаты нормалей поверхности соответственно. Красный канал пространства касательных карты нормалей отвечает за ось X (нормали направленны влево или вправо), зелёный канал за ось Y (нормали направлены вверх или вниз) и синий канал за ось Z (нормали направлены прямо от поверхности).

Пространство касательных (Tangent Space)

Прежде чем мы перейдем к моделированию и запеканию, я должен рассказать вам о том, что такое пространство касательных (Tangent Space). Самый распространенный тип карты нормалей, залитый синим цветом и встречающиеся повсюду в интернете, называется картой нормалей пространства касательных (Tangent Space Normal Map).

В мире 3D существует множество координатных систем: мировое пространство, локальное пространство, пространство камеры и т.д. Пространство касательных – очередная координатная система со своим назначением. Она используется ради обозначения текстурных координат для поверхности полигона. Вы уже, вероятно, знакомы с UV координатами. Тогда представьте, что ось X сонаправлена с V, а ось Y с U. Теперь у нас есть координаты модели, представленные в 2D пространстве. Но координатной системе необходима третья ось для существования в 3D пространстве и для этого нам необходима нормаль поверхности (N). В координатах пространства касательных нормаль поверхности отвечает за ось Z в мировых координатах.

На этом изображении представлены мировые координаты внизу слева и координаты пространства касательных, привязанные к полигону, состоящему из двух треугольников

Это изображение позволяет представить координаты на самой распространенной форме – на кубе.

Оси U, V и N обозначают направления, в которых их значения изменяются вдоль поверхности, так же как X, Y, Z представляют направления, в которых изменяются их значения в мировых координатах.

Это означает, что мы можем передавать координаты пространства касательных через RGB каналы карты нормалей. Красный канал ответственен за ось U, синий за N, а зелёный за V.

Дело в том, что разные приложения могут также по-разному работать с зеленным каналом и порой, когда возникают проблемы с отображением в определенном приложении, то стоит попробовать инвертировать зелёный канал или, говоря по-другому, сменить DirectX на OpenGL или наоборот. (OpenGL – Y+; DirectX – Y-)

Таблица с ориентацией каналов для разных приложений:

Пространство объекта (Object Space)

Карта пространства объекта используется гораздо реже в игровой индустрии, но, порой, ее использование позволяет решить некоторые проблемы. Дело в том, что она использует ориентацию объекта в мировом пространстве, а это значит, что после запекания карты, модель нельзя деформировать.

Достоинства:

•Легче генерировать карту кривизны
•Слегка улучшенная производительность

Недостатки:

•Нельзя повторно использовать. Разные формы требует разных карт.
•Тайлить или отзеркалить можно только с поддержкой шейдера.
•Трудно добавлять отдельно запеченные детали из-за сильной вариативности цвета.
•Плохо сжимается.

-Чувак, это сложно. Какое мне дело?

Карты нормалей пространства касательных используют особый вид вершинных данных, называемых базисом касательных (tangent basis). Если световые лучи существуют в мировом пространстве, то нормали, хранящиеся в карте нормалей, в пространстве касательных. Когда движок обрабатывает модель с примененной картой нормалей, световые лучи преобразуются из мирового пространства в пространство касательных, используя для этого базис касательных. К этому моменту падающие световые лучи сверяются с направлением нормалей с карты нормалей, что определяет освещенность каждого пикселя объекта. Однако вместо преобразования световых лучей, некоторые шейдеры преобразуют нормали из пространства касательных в мировое. Затем преобразованные нормали сверяются со световыми лучами для создания необходимой освещенности. Конечный способ определяется создателем шейдера, но результат в обоих случаях один и тот же.

Трудности могут возникнуть из-за существования множества разных способов расчета базиса касательных. Это значит, что карта нормалей, запеченная в одном приложении, может отображаться совершенно иначе в другом. Когда рендер (например, игровой движок) обрабатывает вашу модель, шейдер должен использовать тоже пространство касательных, что и приложение для запекания, иначе модель получит некорректное освещение, особенно вдоль UV швов.

Если вы не уверены в том, какое пространство касательных используется в конечном движке, то необходимо добавлять жесткие грани/группы сглаживания или использовать поддерживающую геометрию, чтобы минимизировать шансы появления нежелательных эффектов

-Я хочу, чтобы мои нормали выглядели отлично без тонны лишней работы!

Для ситуаций, когда необходимо конвертировать имеющуюся карту нормалей в карту, использующую другое пространство касательных, существует программа Handplane. Это полностью бесплатное приложение. Сначала необходимо запечь карту нормалей, используя пространство объекта (Object Space), которую затем конвертируют в карту нормалей с необходимым пространством касательных.

Если вы запекаете, используя Maya, то помните, что она имеет общий алгоритм расчета пространства касательных с Marmoset Toolbag.

Создаем карту нормалей

Процесс создания карт нормалей (и не только их) обычно называют “запеканием”. Выглядит это следующим образом:

Как вы видите, карта нормалей способна лишь имитировать вид HP модели, не изменяя сам силуэт.

Создание HP модели

Толщина фасок

Если вы хотите перенести фаски с HP модели на карту нормалей, то необходимо их делать мягче. Если фаски будут слишком острые, то они станут трудноразличимы на модели с примененной картой нормалей, а, значит, станут хуже читаться на расстоянии.

Детали со скосом

Из-за принципа работы проекции HP геометрии на LP запечка не может захватить слабозаметные детали. Поэтому, если вы хотите передать вдавливания или выступы через карту нормалей, то им необходимо добавить дополнительные фаски/скосы, чтобы стать заметными на плоской поверхности при виде спереди.

Пересечение геометрии

Разнесённая геометрия и бейк-группы

В случае, где необходимо запекать пересекающеюся геометрию стоит обращать внимание на взаимное расположение таких объектов. Если они расположены слишком близко друг к другу, то их проецирующие кейджи начнут пересекаться, что выльется в ошибки на карте нормалей.
Чтобы избежать этого существует два способа:

Разнесенная геометрия (Exploded mesh)

Логично, что если расположить геометрию друг от друга на достаточное расстояние, то и их кейджи никогда не пересекутся, а, значит, и не возникнет ошибок на нормале. Чтобы после запекания не тратить лишнего времени на объединение модели вручную элементов модели, можно, используя 3D пакет, поставить ключ анимации на моменте, когда вся модель собрана, и еще один на моменте, когда каждый пересекающийся объект разнесен на нужное расстояние. Тогда после запекания у вас не будет проблем с тем, чтобы собрать модель обратно воедино.

Бейк-группы (Bake groups)

Marmoset Toolbag.
Для загрузки с учетом бейк-групп, нажмите на значок загрузки моделей в панели Quick Loader. Выбрав свои LP и HP модели Marmoset автоматически создаст бейк-группы для запекания.

Если все было сделано правильно, то у вас не возникнет проблем из-за пересечения геометрии!

Substance Painter
Процесс подготовки объектов ничем не отличается от вышеописанного. Чтобы SP учитывал созданные бейк-группы при запекании, необходимо для поля Match выбрать By Mesh name.

Сокращение полигонажа (Decimating)

Если вы импортируете свою HP из Zbrush в другие приложения, то хорошей практикой будет предварительно сократить ее количество полигонов. Не существует четкого правила, определяющего, как сильно стоит урезать полигонаж, прежде чем HP начнет выглядеть некорректно, поэтому рекомендуется делать тестовые запечки, перед тем как идти дальше. В большинстве случаев достаточно сокращения в 20% от оригинала. Если модель выглядит хорошо после этого, то можно переходить к запеканию.

Все вышеописанное делается для того, чтобы не перегружать рендер лишним количеством полигонов. Ведь если объект выглядит одинаково при 4млн. и 2млн. полигонах, то зачем нагружать приложение? Главное, следите за объектом в процессе, поскольку вам также не нужны артефакты на карте нормалей и пропавшие детали.

Плавающая геометрия (Floaters)

Плавающей геометрией (флоатерами) называются HP объекты, которые существуют отдельно от основной модели и нужны для быстрого добавления деталей под запекание карты нормалей. Это хороший способ сымитировать геометрию, без необходимости тратить лишнее время на вшивание деталей в оригинальную HP. Недостаток скрывается в том, что необходимо подстраивать LP к плавающей геометрии, и это довольно сложно, если вы хотите расположить ее у круглых или сложных поверхностей, поэтому чаще всего ее используют у плоских поверхностей. Если вы расположите камеру прямо напротив плавающей геометрии и не увидите видимых переходов, то и на запеченной геометрии их видно не будет.

Важно, чтобы плавающая геометрия имела плоские грани и располагалась, как можно ближе к основному объекту.

Когда стоит моделировать, а когда рисовать.

Затем перенесите полученный результат в Photoshop и скомбинируете его с оригинальной картой нормалей. Для комбинирования карт нормалей существует несколько методов:

Методы комбинирования карт нормалей

Комбинируя карты нормалей нужно помнить о том, что вы смешиваете не просто две картинки в одну, а смешиваете векторную информацию двух разных объектов. Если наложить две карты через обычное смешивание, то на конечном результате мы лишимся синего канала, что может стать проблемой в некоторых движках.

Плагин для Phostoshop – RNM Normal Map Combiner (http://farfarer.com/resources.htm), позволит автоматически смешать карты нормалей без потери векторной информации.

Приложение Crazybump также позволяет совместить карты нормалей.

Внутри Substance Painter существуют специальные режимы смешивания карт нормалей, способные также решить проблему:

Создание LP модели

Градиенты

Давайте проведем тест с запеканием простого куба. Каждая поверхность куба разделена на UV развертке и имеет уникальную группу сглаживания:

Выглядит хорошо, да? Без градиентов, все запеклось идеально. Но что это значит и как этого достичь? Или более интересный вопрос: мне стоит беспокоиться?

Это означает, что ваши нормали LP модели сонаправлены с нормалями HP, и карте не нужно делать лишней работы для компенсации сильных углов градиентами на вашей LP модели. На практике, наилучшим вариантом является запекать карту нормалей лишенную градиентов, насколько это возможно.

Но теперь давайте взглянем на сильные градиенты. Я сшил все UV острова вместе и применил одну группу сглаживания на весь объект.

Обратите внимание, как изменились градиенты из-за использования другого алгоритма расчёта пространства касательных.

Существует несколько преимуществ от использования чистой запечки:

Жесткие грани и UV

Как расставлять жесткие грани:

В 3DsMax для обозначения “жестких” поверхностей, необходимо использовать группы сглаживания. В режиме выделения полигонов выделите нужные полигоны и примените группу сглаживания из панели по правой стороне.

Если вы пользуетесь Maya, то в режиме выделения граней выберите нужные и во вкладке “Mesh Display” нажмите “Harden Edge” – для указания жесткой грани, и “Soften Edge” – для мягкой.

Рассмотрим это на примере простого куба. Сейчас объект имеет две группы сглаживания: одну для одной поверхности и другую для всех остальных. Вы можете увидеть, что поверхности с общей группой сглаживания имеют искажённое затенение. Если вы столкнулись с подобным, то это значит, что и на карте нормалей будут присутствовать подобные градиенты после запекания. Посмотрим, как это работает.

На скриншоте с картой нормалей видно, что одна поверхность выглядит отличной от остальных. Помните, что я ничего не делал с UV, а лишь применил другую группу сглаживания к поверхности. Сейчас она выглядит чистой и ровной, но вот в движке это смотрится не очень.

Давайте поближе взглянем на грани поверхности с отдельной группой сглаживания. Выглядит не очень, да?

В местах расположения жестких граней необходимо делать разрез на UV развертке!

Я разделил поверхность с жесткой гранью на UV. Перезапек карту и вот результат:

Теперь видно, как жесткая поверхность стала отдельной частью на развертке и отчего она отлично смотрится в движке.

Если я применю уникальную группу сглаживания для каждой поверхности и разнесу их на UV развертке, то получу идеальную карту нормалей. Но что если у меня не 6 поверхностей, а намного больше? Есть простой ответ на этот вопрос.

Для того чтобы быстро расставить группы сглаживания, скачайте плагин TexTools. (http://renderhjs.net/textools/3dsMax.html). После этого откройте его в 3DsMax и на основной панели, открыв вкладку Tools, выберете опцию “Smoothing groups from UV shells”, предварительно выделив нужный объект.

Основной процесс выглядит следующим образом:

Отражение UV

Если вам необходимо отразить половину LP объекта, то вот хороший способ сделать это:

Округлость и волнистость на карте нормалей

После запекания, на карте нормалей вы можете заметить “волны” вдоль граней UV островов. Они возникают из-за несовпадения LP модели с HP.

Сопоставление геометрии во время ретопологии

При работе над ретопологией (LP моделью) очень важно максимально близко подводить геометрию к HP модели, иначе вы получите ошибки проецирования при запекании, и карта нормалей будет отображаться некорректно. Из-за этого также сложнее будет контролировать кейдж.

Триангуляция

Поскольку разные приложения для запекания и игровые движки триангулируют модель при импорте по-своему, то чрезвычайно важно триангулировать модель перед запеканием самостоятельно, чтобы избежать различий в затенении между приложениями.

3DsMax

Используйте модификатор Turn to poly, в настройках которого поставьте галочку на “Limit polygon size” и установите значение в поле равное 3. После этого ваша модель триангулируется, и вы сможете отправить ее на запекание!

Для просмотра триангуляции и внесения возможных изменений используйте панель Tris.

Maya

Выделите поверхности объекта и в настройках объекта выберите параметр Triangulate.

Наилучшие подходы в создании UV под запекание и текстурирование

Работая над разверткой, всегда важно думать о текстурировании. Если, например, вам нужно добавить одинаковые прямые детали к ремню, то важно расположить его UV остров ровным.

Сшивая UV острова, вы должны также думать о том, видна ли будет эта часть объекта или нет, можете ли вы позволить себе наличие градиентов в этой части.

При создании UV развертки важно располагать UV острова под прямым углом, где это только возможно. Поскольку иначе при запекании на грани появится эффект альязинга, который на текстуре будет выглядеть как лесенка из пикселей. Особенно этот эффект будет заметен, если UV остров имеет небольшой тексель или сама текстура маленького разрешения.

Искаженные детали на запечках

Прежде чем переходить к практическим примерам, обсудим немного теорию. Почему некоторые детали после запекания выглядят искаженными на карте нормалей, и как это исправить? Это происходит из-за особенностей проецирования. Для запекания нормалей используется проецирующий кейдж, который оборачивает собой HP объект и испускает проецирующие лучи для переноса информации об освещенности HP объекта на карту нормалей. Существует два типа кейджей, используемых для запекания:

Кейдж с усреднёнными нормалями игнорирует нормали LP объекта при определении направления проекции, усредняя все вершинные нормали. Основное достоинство состоит в том, что даже с использованием жёстких граней/групп сглаживания на местах фасок не появятся швы. Негативный эффект выражается в появлении искаженных деталей на карте нормалей.

Explicit Normals непосредственно использует нормали LP объекта для построения кейджа. Следовательно, если на LP объекте расставлены жесткие грани/группы сглаживания, то на финальной модели появятся швы на местах фасок. Но, в отличие от первого способа, все детали запекутся без искажений.

Рассмотрим на примере, как бороться с искаженными деталями на запечке.

Можно сделать LP модель такой, добавив ей поддерживающие грани:

Это быстро дает хороший результат, но с расходованием дополнительных полигонов на LP объекте.

Поскольку на добавленных поддерживающих гранях вершинные нормали направлены строго перпендикулярно поверхности, то и результат, взятый от их среднего значения, не изменится по отношению к направлению нормалей вершин.

Модель без поддерживающих граней:

Модель с поддерживающими гранями:

Видите, насколько велика разница в полигонаже между двумя объектами после добавления дополнительной геометрии? Поэтому используйте этот подход только на свое усмотрение.

-Что если я не хочу тратить лишние полигоны на LP, но и не хочу получить искаженных деталей?

Это очень интересный вопрос, и вот ответ на него!

Фактически, вы добавляете дополнительные грани для поддержки при запекании, после которой их можно удалить. Но, к сожалению, это будет работать не всегда. Сначала необходимо решить, как будут выглядеть градиенты на карте нормалей. Сделайте две запечки: одну без дополнительных граней и другую с ними, а затем взгляните на различия в градиентах между двумя картами нормалей.

Они практически идентичны. И почему так? Разве я не добавил дополнительной геометрии? Суть в том, что дополнительные грани помогают ослабить градиенты, но в данном случае я уже разделил UV острова на местах с жесткими гранями/группами сглаживания, поэтому дополнительной геометрии не пришлось ничего изменять.

Так почему это важно? Если я удалю добавленные грани и применю карту нормалей внутри движка, то вот что мы получим – идеальный результат. Нет никаких различий в положении нормалей у двух объектов, хотя один из них имеет меньшее количество полигонов. Круто.

Но теперь проведем другой тест. В этот раз я сошью UV острова и назначу одну группу сглаживания ко всему объекту только для того, чтобы показать сильные градиенты на карте нормалей.

Ух ты, кажется, мы что-то сломали.

Дело в том, что градиенты двух моделей стали слишком разными, и для модели без поддерживающих граней карта нормалей не может их правильно компенсировать.

Так что же делать, если у меня есть градиенты, но я не хочу назначать жесткие грани, разделять UV и прочее? Вот несколько способов:

Способ 1 (SkewMesh)

Один из простейших способов избавиться от искаженных деталей на объектах, где другие методы могут быть трудноисполнимыми, называется Skewmesh, который работает следующим образом:

То что мы и ожидали увидеть. Теперь исправим это.

Убедитесь, что значение в поле Tension – 0, и количество итераций установлено на значении 3 или 4.

Marmoset Toolbag

Импортируете тесселированную модель в Marmoset Toolbag, отрегулируете кейдж и запеките карту Normals Object. Затем также конвертируете карту Object Space в Tangent Space, используя Xnormal.

Способ 2

Xnormal

3 — Для запекания карты Object Space необходимо снять галку с Tangent Space в настройках.

4 — Выберите вашу модель (с поддерживающими гранями) и запеките ее.

Так выглядит карта Object Space, странного желтого цвета. Но это не важно. Что важно, так это то, что сейчас мы будем конвертировать ее в карту Tangent Space

5 — Выберите Object/Tangent конвертер.

Загрузите вашу финальную модель в слот с LP. Карту Object Space добавьте в поле “Input normal map” и выберете формат, в котором вы хотите сохранить карту нормалей.

Вот наш результат при наличии всех градиентов. Так где разница, спросите вы?

Заметьте, что нет никакой разницы в нормалях между двумя объектами. Вот, что случилось:

Конвертер взял карту Object Space, которую мы запекли с модели с поддерживающими гранями, и сгенерировал карту Tangent Space с учетом затенения финальной модели. Теперь вы можете запекать карты нормалей с поддерживающими гранями, не волнуясь о вреде градиентов и искажений.

Способ 3 (Explicit Normals)

Xnormal
Вы можете избежать этих трудоемких способов, действуя следующим образом:

Теперь вы получили чистый результат без искаженных деталей. После совместите необходимую часть с оригинальной картой нормалей в Photoshop или воспользуетесь описанным выше методом с картой Object Space, если необходимо назначить запеченную карту на LP модель с отличным сглаживанием.

Marmoset
Для того чтобы запечь детали без искажений в Marmoset Toolbag, необходимо в настройках Baker снять галочку с Smooth Normals.

Отрегулировав кейдж нужным образом, вы получите карту нормалей без искаженных деталей, после чего сможете совместить результат с оригинальной картой в Photoshop.

Способ 4

Внутри Marmoset Toolbag мы можем воспользоваться инструментом Paint Skew, чтобы избавиться от искажений на карте нормалей. Нажмите кнопку “Paint Skew”, чтобы перейти в режим редактирования, и начните кисточкой указывать области, которые хотите исправить. Эта функция работает путем попиксельного смешивания нормалей поверхности объекта и нормалей кейджа. На 2D карте черный цвет будет означать полностью исправленные искажения, а белый – оригинальные нормали.

Перекрывание несимметричных UV островов

Иногда (или довольно часто) делая UV развертку, вы можете увидеть множество одинаковых или очень схожих UV островов и подумать: “Ух ты, какая трата ценного UV пространства”

К счастью, существует простой метод наложить друг на друга UV острова, принадлежащие одинаковым объектам, и получить хороший результат.

Предположим, у вас есть вытянутый куб.

Если вы разделите каждую поверхность на UV согласно расставленным жестким граням, то получите 6 UV островов. Вот, что вы увидите после запечки:

Обратите внимание, насколько схожи эти UV острова. Один из кусков выглядит так же, как остальные три, и оставшиеся два побольше тоже выглядят почти идентично.

Мне правда нужны все эти острова? Давайте сложим их друг на друга!

Мы так и сделаем, но сначала вы должны подумать о том, как собираетесь текстурировать эту модель. Нужны ли вам уникальные детали на каждой поверхности? Важно ли держать их отдельно для уникальных рельефных деталей или царапин? Сильно ли будет заметно то, что они отзеркалены?

Если вы решите накладывать острова друг на друга, то дальнейший процесс достаточно прост, хотя есть некоторые вещи, о которых необходимо помнить:

Чистый и хорошо выглядящий результат. Я применил быстро сделанную карту нормалей на втором скриншоте, чтобы вы могли посмотреть, как это выглядит.

Но что если мои UV острова различаются, а я все равно хочу их наложить друг на друга?

Вы можете попробовать это сделать, но стоит быть крайне осторожным. У вас есть два выбора, когда предстоит накладывать друг на друга UV в подобных случаях.

Это может сработать с простыми квадратными UV островами, но, скорее всего, станет проблемой при работе с чем-то более сложным, и тогда себя сильно проявят потяги на развертке. Попробуйте и посмотрите сами. Вам также стоит остерегаться того, что, изменяя масштаб и размер островов, вы назначаете им непропорциональное количество текстурного пространства и соответственно получаете следующее:

Левый – подогнанная UV; средняя – оригинал; правая – меньший UV остров лежит внутри большего.

Можно заметить, что размер рельефных деталей слева отличается от оригинальной развертки. При правильном подходе это может стать преимуществом. Будьте внимательны, когда станете накладывать UV острова друг на друга.

Вот, что из этого выйдет:

Поскольку меньший остров не разделяет те же фаски на карте нормалей, то, соответственно, их не видно на модели внутри движка, из-за чего вы получаете выделяющиеся жесткие грани.

Запекание

Сбросить трансформацию

Прежде чем запекать карты, убедитесь, что трансформация вашей LP модели сброшена. Это чрезвычайно важно! Часто в процессе моделирования модель вращается и масштабируется, и эти манипуляции могут создать путанные локальные координаты для модели, что часто оборачивается ошибками при запекание карт нормалей.

3DsMax
Во вкладке инструментов найдите Reset Xform. Примените его, желательно предварительно сбросив стек. После чего экспортируйте модель.

Maya
В закладке Modify вам необходимо воспользоваться инструментом Freeze Transformation, предварительно удалив историю для модели.

Отступ граней

Если карта нормалей не имеет достаточный отступ, то это создаст швы на границах UV островов.

Направление нормалей

Перед запеканием убедитесь, что ваша HP и LP модель имеет корректное направление нормалей, то есть, нет инвертированных нормалей. Внутри 3DsMax вы можете проверить это, выбрав Face Direction на выделенном объекте. После этого инвертированные поверхности подсветятся зеленым. Если инвертированные поверхности останутся незамеченными, то это выльется в ошибки проецирования, поэтому будьте внимательны.

Описание всего процесса

При запекании карты нормалей необходимо создать проецирующий кейдж, чтобы получить хороший результат с учетом жестких граней. Существует несколько способов сделать это:

3DsMax

Примените модификатор Projection к LP модели.

На картинке видно, как кейдж полностью покрывает HP модель с плавающей геометрией. Очень важно, чтобы он закрывал собой все, иначе возникнут ошибки проецирования.

В поле Push настройте уровень отступа кейджа от объекта. Amount = расстояние. Вы можете также манипулировать кейджем вручную через вершины. В 3DsMax манипулирование кейджем может повлиять на расстояние проецирования и направление лучей проекции, поэтому двигая вершины вручную, необходимо быть крайне осторожным.

Maya
В настройках Transfer Map регулируете размер кейджа через слайдер “Search Envelope”. Поскольку, в отличие от 3DsMax кейдж в Maya можно регулировать лишь по величине отступа, то можно меньше волноваться о возможных ошибках проецирования.

Xnormal
Вы можете создать кейдж для своего объекта прямо внутри Xnormal. Для этого необходимо перейти в 3D Viewer.

Отметьте поле Edit Mesh и начните редактировать кейдж. Сохраните результат по окончанию.

Вместо этого вы можете импортировать кейдж прямо из 3DsMax.

Нажмите ПКМ на строке с LP объектом в XNormal и выберете “Browse external cage file”, после чего добавьте экспортированный из 3DsMax кейдж.

Marmoset Toolbag

В Marmoset регулировать кейдж можно только по величине отступа от LP. Для этого воспользуйтесь параметром Min offset/Max offset. Используя Paint Offset можно точнее контролировать отступ кейджа. Он позволяет указывать отдельные области, где необходимо изменить отступ кейджа от LP. Если же вы не хотите производить ручных настроек, то нажмите кнопку Estimate Offset, функция которой попытается рассчитать наилучшую форму кейджа для LP модели.

Устранение ошибок

Даже с таким подробным руководством у вас на руках можно столкнуться с множеством разных проблем, когда речь заходит о запекании карт нормалей. Дальше я покажу вам, как предотвращать и решать большую часть из них.

Будьте подготовлены

Чаще всего, это все что нужно, чтобы быть уверенным, что модель полностью готова к запеканию.

Давайте взглянем на специфические проблемы.

-Я все сделал правильно, но до сих пор вижу швы на карте нормалей!
-Я вижу странный шум на поверхности объектов после применения карты нормалей.

Причина, по которой вы видите это – малая глубина битов. Это не то, о чем вам предстоит волноваться большую часть времени, поскольку этого легко избежать. Есть два распространенных способа, которые используют рендеры для компенсации проблемы:

Подобные артефакты становятся заметнее на отражающих поверхностях. Как уже было сказано, это происходит из-за недостатка глубины битов на канал (глубины цвета). Это означает, что на текстуре недостаточно цветовых оттенков для передачи более точных цветовых переходов, что приводит к появлению ступенчатых артефактов. Вы можете запечь карту с большей глубиной цвета, то есть 16 бит на канал, но так как некоторые рендеры могут работать только с 8-битной картой нормалей, то позже вам может понадобиться конвертировать ее. Поэтому предпочтительным вариантом рендеринга для минимизации проблем с отражающими поверхностями является сглаживание карты нормалей за счет добавления шума. Marmoset Toolbag использует данный метод по умолчанию.

-Мои запечки желтого цвета, а должны быть синего. Что я должен делать?

Если вы выполнили все вышеописанные шаги по подготовке к запеканию, то никогда не должны были с этим столкнуться. Но на случай, если что-то ускользнуло от вас, напомню, что данная проблема встречается при наличии инвертированных поверхностей на HP. Исправьте и запеките повторно.

Рисование вручную

-Стоит ли исправлять карту нормалей руками?
-Как добавить детали на карту нормалей.

Хорошо, я запек объект, но мне еще не хватает деталей. Как добавить, например, рельеф ткани или другие детали?

Существует множество способов создания дополнительных деталей для карты нормалей. Простой способ – это конвертировать карту высоты в карту нормалей через плагины в Photoshop, Xnormal, Quixel или Substance.

Карта высоты – это карта в градациях серого цвета.

Серый – средний слой.

Используя эту технику, вы можете конвертировать карту в серых тонах в карту нормалей.

Приложения для рисования на карте нормалей

С помощью Quixel и Substance Painter добавление деталей на карту нормалей стало достаточно простым процессом. Если вы работаете в SP, то можете с легкостью добавлять рельефные детали через канал Height, который, в свою очередь, автоматически перенесет полученную информацию на канал Normal, из которого вы можете выгрузить карту нормалей с учетом новых деталей.

Также вы можете использовать Quixel Suite 2. Это плагин для Photoshop, позволяющий рисовать прямо на карте нормалей и быстро генерировать детали через внутренние инструменты Photoshop.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *