250126

Errata·2025년 1월 26일

개발 일지

목록 보기
63/350

✅ 오늘 한 일


  • 유튜브 강의 듣기 : GAME ASSET BEGINNER TUTORIAL
  • Project DR
  • 씹어먹는 c++


🎮 Random Study


UV Unwrapping in Blender (Part 2/5)

https://www.youtube.com/watch?v=-uYwkBCPpiQ&list=PLQk3p-aJsSWTKKmuFwnzEVaf3ovKIg1jx&index=14

UV unwrapping을 해야 한다

  • Ctrl + A > Rotation & Scale
  • N > Rotation 0,0,0, < Scale 1,1,1
    • 이거 안 해주면 UV unwrap하고 나서 UV map이 이상해진다
  • Menus > UV Editing > New > Name 'UV_Grid' > Alpha 체크 해제 > Generated Type 'UV Grid' > Tab 눌러서 Edit 모드 종료
    • 오브젝트의 메시를 감싸는 텍스쳐가 어떻게 생겼는지 확인하기 위함
  • 오브젝트 선택된 채로 > Properties > Material > New > Base Color의 노란색 점 클릭 > Image Texture > 방금 만든 UV Grid 선택 > 적용된거 확인하려면 Header 우측에서 Viewport 설정 변경
    • 보면 아직 오브젝트 전체가 감싸지지 않았기 때문에, UV Unwrap을 해야 한다.
  • Tab > A > UV Map을 제대로 보기 위해 UV Window에서 UV Grid Texture 제거 > Alt + A > 2 > Alt + 좌클로 통 맨 위 선택 > 우클릭 > Mark Seam (UV Map에 절단면 만든다) > 아래 면에도 똑같이 Edge loop 선택하고 Mark Seam
  • A > U > Unwrap > L로 UV Island 확인 > Texture에 UV Grid를 적용시키고 R로 회전시켜보면 메시에 적용된 텍스쳐도 회전한다는 걸 확인할 수 있음. 확인만 하고 UV Grid 적용 취소
  • A > U > Unwrap > 좌측 하단 > Method > Conformal
    • Conformal: 정확한 비율을 유지하며 폴리곤을 펼침.
  • 통 벽도 펼치기 시작 > 엣지 하나 클릭하고 Ctrl + 좌클릭으로 반대편 엣지 클릭하면 그 사이에 있는 엣지들 다 선택됨 > Mark Seam > A > U > Unwrap

  • 통 벽이 아직 비율이 맞지 않음. 이러면 텍스쳐도 왜곡됨.
  • Tab > Alt + A > Alt + 좌클로 통 벽 edge loop 선택 > 우클 > Align Verically 또는 Align Horizontally > 모든 edge에 대해 align 해준다 > 다른 축 edge들도 다 펴준다
  • 통의 뚜껑 부분도 Unwrap 해주기 시작 > Ctrl + Alt + 뚜껑 옆면 edge 하나 좌클 > 우클 > Mark Seam > 뚜껑에 대고 L > U > Unwrap > UV Editing에서 L로 뚜껑 UV 선택 > G로 옆으로 옮기기 > View Port에서 A로 모두 선택 > UV Editing에서 A > 좌측 상단 UV > Average Islands Scale
  • 통 벽 선택하고 Numpad 1로 확인해보면 텍스쳐가 약간 늘어나있음 > S > X > 정사각형으로 보이도록 조정
  • UV Editing에서 A > UV > Pack Islands > 확인 > A > R > Angle에 90도 혹은 Ctrl 누르며 90도 회전 > G로 UV space에 맞게 이동 > S로 살짝 줄여서 빈 공간 살짝씩 있게 > 통 벽 제외한 UV Island L 눌러서 다 선택하고 > G > Y로 공간 생기게 이동 > 나머지도 x축 조절하여 빈 공간 생기게
    • 픽셀 Bleeding(픽셀 침범)이란? UV Island 간 간격이 너무 좁거나 겹칠 경우, 텍스처의 픽셀이 의도하지 않게 다른 Island로 넘어가는 현상
  • UV Island 선택하고 움직여보면서 어디가 어디에 적용돼있는지 확인 > 위치 조정 > 통 벽 UV Island를 내리면 텍스쳐가 위로 올라가야 한다 > 아니라면 R로 180도 뒤집기
    • 왜 방향이 반대인가? : UV 좌표계에서 V 축은 아래가 0, 위가 1로 설정됩니다. 이는 일반적인 2D 텍스처의 픽셀 좌표계와 반대입니다.
  • UV Editing 좌측 상단 대각선 화살표 2개 교차한 아이콘 클릭 (UV Sync Selection) 하면 UV 선택하면 Viewport에서도 선택됨 > 일단 옵션 꺼두기
  • UV Editing 좌측 상단 UV Select Mode : Island 클릭하면 클릭할 때 UV Island 단위로 선택 가능 > 통 위 아래 선택한 뒤에 R로 가운데 edge들이 평행하도록 만들기

Texturing In Blender & GIMP (Part 3/5)

  • UV Editing > UV > Export UV Layout > Barrel_UV로 명명하고 Size는 2048x2048로 바꾸고 Export > GIMP로 열기
  • Layer 'Walls'를 만들고 Barrel_UV 레이어 아래로 > Barrel_UV 레이어 선택하고 Fuzzy Select(마법봉) 클릭 > 임계값 조절하여 UV Island 전체 선택 > 우클 > Select > Grow > 10px > Walls 레이어 선택 > Bucket Fill Tool > Foreground Color를 나무 색깔로 바꾸기 > Walls Layer에 색칠 > 다른 곳도 동일하게 선택하고 늘이고 칠하기 (영역 겹치지 않게 늘이기 조절, Ctrl+Shift+A로 선택 해제)
  • Layer 'BG' 만들고 맨 아래에 두기 > Barrel_UV 안 보이게 하고 > BG 레이어에 살짝 밝은 색 칠하기
  • File > Save as > Barrel_Albedo.xcf로 GIMP 형식으로 먼저 저장 > File > Export as > Barrel_Albedo.png
  • Blender로 가서 머테리얼의 Base Color에 Barrel_Albedo.png 선택 > UV Editing에도 Texture 적용 > Image를 바꾸면 텍스쳐도 바뀌게 된다
  • GIMP로 가서 Metal 레이어 만들기 > Barrel_UV 보이게 하기 > 사각 선택 툴로 금속이 될 부분 선택 > 회색으로 칠하기 > Metal_Top과 Metal_Bottom 레이어로 각각 나누어 칠하기 > Barrel_UV 안 보이게 하기 > File > Export To Barrel_Albedo.png
  • Blender로 가서 Alt+R하면 텍스쳐 업데이트됨
  • GIMP로 가서 경로 선택 툴 선택 > Barrel_UV 레이어 표시 > UV Map 경계에 맞게 일진석 긋기 > 우측 메뉴에서 경로 메뉴 > Unnamed 선택 > 복제 > Alt+좌클릭으로 경로를 다음 선에 이동시키기 > 반복하여 모든 세로 선에 경로 위치시키기 > 경로 메뉴 우클 > Merge Visible Paths > Walls_Highlight 명명
  • 경로 하나 클릭하여 선택 (모든 동그라미들이 하얀색으로 채우기) > 레이어 탭으로 가기 > Walls 레이어 위, Metal 레이어 아래에 Walls_Highlight 레이어 만들기 > Barrel_UV 레이어 안 보이게 하기 > 더 밝은 나무 색깔 선택 (모니터 위에 스포이드 있는 아이콘으로 컬러 피킹) > Walls_Highlight 레이어 선택 > 좌측 메뉴 Stroke Path (경로 따라 그리기) > 선 너비 20px > 선(Stroke)

Alt+R 누르면 나오는 Nvidia 성능 오버레이 끄기
설정 > HUD 레이아웃 > 성능 > 끄기

  • 다시 경로 선택 > Walls_Shadow 레이어 생성 > 더 어두운 나무 색깔 고르기 > Stroke Path(경로 따라 그리기) > 10px > 텍스쳐를 더 잘 보려면 경로 탭 가서 경로 안 보이게 하고 Move Tool 선택
  • 위랑 아래에도 같은 작업 해주기 시작 > GIMP로 돌아오기 > Barrel_UV 보이게 하기 > 통 위랑 아래에도 경로 그리기 (이전 경로 선택 취소하려면 다른 도구 선택했다가 오기) > Shift+좌클로 새 경로점 생성 > 모든 선들에 대해 경로 생성하기 > 경로 탭 가서 새 경로에 Top_Highlight 명명 > 레이어 탭 가서 Top_Highlight 레이어 생성 > 다른 UV Island에도 반복
  • Bottom Highlight, Shadow는 Top Layer 복사 > 이름 바꾸기 > Move Tool > 현재 레이어 이동
  • 레이어 그룹 만들어서 Top, Bottom 등 정리 > Top, Bottom에 가로축용 Highlight도 더 추가 > 시작하고 끝 이어서 원 만들려면 마지막에 Ctrl+좌클로 이어주기 < Lid에 옆 선 만들 땐 대충 선 추가하고 기존 점에 비슷하게 위치시키기
  • 블랜더로 돌아가서 Material Roughness 0.8
  • GIMP로 돌아가서 텍스트 추가
  • Walls 레이어 우클 > 알파를 선택 영역으로 > Dirt 레이어 추가 > Grunge 01 브러시로 흙 느낌 칠하기 > 적당히 지워주고 투명도 조절
  • 텍스트 레이어 선택 > 우클 > 레이어 마스크 추가 > 브러시 색깔 검은색 설정 > 텍스트에 칠해서 칠 벗겨진 느낌 주기
  • Metal과 Walls 사이에도 Dirt 칠해주면 디테일 증가
  • Metal scratch 추가해주기 > 경로로 사각형 만들기 > 밝은 색으로 경로 따라 그리기 > 레이어 하나 새로 만들기 > 어두운 색으로 Fill Path

  • Blender로 돌아가기 > WorkSpace에서 Layout 선택 > Viewport Shading 변경 > Shift+A > Light > Sun > Plane 추가해서 그림자도 확인 > Intensity 올리기 > Transform에서 각도 조절 > Angle 조절하면 그림자 흐려짐 > World Property > Color 조절

🎮 Project DR


카드 정렬

    void Update()
    {
        SortCard();
    }

    public void SortCard()
    {
        float diff = (right.transform.position.x - left.transform.position.x) / (cardArray.Length + 1);
        for (int i = 0; i < cardArray.Length; i++)
        {
            // Vector2 newPos = (left.transform.position + right.transform.position) / 2;
            Vector2 newPos = new Vector2(left.transform.position.x + diff * (i + 1), cardArray[i].transform.position.y);
            cardArray[i].transform.DOMove(newPos, 0.5f);
        }
    }

일단 x축 정렬되게
그리고 생각해보면 이거 중요한 거 아니니까 제발 프로토타입 먼저



💻 씹어먹는 c++


1 - 2. 첫 C++ 프로그램 분석하기

#include <iostream>

int main()
{
	std::cout << "Hello, World!" << std:endl;
	return 0;
}

std : c++ 표준 라이브러리의 모든 함수, 객체 등이 정의된 namespace

어떤 정의된 객체가 어느 소속인지 지정하는게 namespace
자신이 속한 namespace에선 앞에 namespace 없이 쓸 수 있다
다른 namespace는 명시만 해주면 가져다 쓸 수 있는데
#include "header1.h 이런거 선언해주면 명시도 안해줄 수 있음

#include <iostream>
using namespace std;

int main() {
	cout << "Hello, World!!" << endl;
	return 0;
}

이렇게 생략이 가능하다는거
(근데 std는 함수가 너무 많아서 중복 될수도 있으니까 이러지 마라)

namespace에 이름 안 붙여도 namespace 선언할 수 있음
이러면 해당 파일에서만 접근할 수 있게 됨 (static 쓴 것과 비슷한 효과)

1 - 3. C++ 은 C 친구 - C 와 공통점

#include <iostream>

int main() {
	int sum = 0;
	for (int i = 1; i <= 10; i++) {
		sum += i;
	}

	std::cout << "합은 : " << sum << std::endl;
	return 0;
}

c언어와 거의 비슷하지만, 변수 정의할 때 소스 맨 위에만 정의할 필요 없고
변수 사용 직전 어디에서든 선언해도 된다

#include <iostream>

int main() {
	int lucky_number = 3;
	std::cout << "비밀 수 맞춰보세요" << std::endl;

	int user_input;

	while (1) {
		std::cout << "입력 : ";
		std::cin >> user_input;
		if (lucky_number == user_input) {
			std::cout << "맞췄다" << std::endl;
			break;
		}
		else {
			std::cout << "틀렸다" << std::endl;
		}
	}
	return 0;
}

c언어 scanf에선 &가 필요했는데 c++에선 붙일 필요 없고 자료형도 cin이 보고 알아서 처리해줌

2. C++ 참조자(레퍼런스)의 도입

#include <iostream>
int change_val(int* p) {
	*p = 3;

	return 0;
}
int main() {
	int number = 5;

	std::cout << number << std::endl;
	change_val(&number);
	std::cout << number << std::endl;
}

c++에서도 포인터 당연히 가능
근데 reference라는 방법도 생김

int main() {
	int a = 3;
	int& another_a = a;

	another_a = 5;
	std::cout << "a : " << a << std::endl;
	std::cout << "another_a : " << another_a << std::endl;
}

another_aa의 또 다른 이름이라는 걸 정의한 것
포인터와는 달리 반드시 초기화 해야됨.

레퍼런스는 한 번 별명이 되면 절대 다른 이의 별명이 될 수 없음

int a = 10;
int &another_a = a; // another_a는 이제 a의 참조자

int b = 3;
another_a = b; // a = 3

포인터는 다른 주소 담을 수 있는데, 레퍼런스는 안된단거.

그리고 레퍼런스는 메모리 상에 존재하지 않을 수도 있음.
another_a가 쓰이는 자리를 모두 a로 바꿔치기 하면
컴파일러가 굳이 메모리 상에 공간 할당할 필요 없기 때문.

그렇다고 항상 존재하지 않는 건 아님

int change_val(int& p) {
	p = 3;

	return 0;
}

int main() {
	int number = 5;

	std::cout << number << std::endl;
	change_val(number);
	std::cout << number << std::endl;
}

참고로 레퍼런스의 레퍼런스, 레퍼런스의 배열, 레퍼런스의 포인터는 존재할 수 없다.
배열은 주소값을 갖고 있어야 하는데, 그러려면 해당 원소가 메모리 상에서 존재해야 하기 때문.

int main() {
	int arr[3] = { 1,2,3 };
	int(&ref)[3] = arr;

	ref[0] = 2;
	ref[1] = 3;
	ref[2] = 1;

	std::cout << arr[0] << arr[1] << arr[2] << std::endl;
	return 0;
}

반대로 배열들의 레퍼런스는 가능하다.
참조할 땐 배열의 크기를 명시해야됨.

지역변수의 레퍼런스를 리턴하면 오류 발생함.
인자로 받은 레퍼런스를 리턴하는 건 괜찮음.



profile
Penser, c'est réapprendre à voir

0개의 댓글