这是用户在 2025-4-6 22:39 为 https://app.immersivetranslate.com/html/ 保存的双语快照页面,由 沉浸式翻译 提供双语支持。了解如何保存?

CG week4.2.2 2025.03.25 Tue PM 2:04 ・ 36Minutes 43seconds ZHANG YIWEN
CG 第 4.2.2 周 2025.03.25 周二 下午 2:04 ・ 36 分钟 43 秒 张一文

Attendees 1 00:00 정점은 오픈제에서 정점은 점의 좌표죠. 그러니까 점의 좌표는 내부적으로 포모디니어스 코디네이트를 사용을 해요. 그래서 3차 2차원이라고 가정을 하면은 x y 1 그다음에 3차원이라고 생각하면 x y 제트 1 이렇게 사용을 하는 거고 사실 2차원 좌표도 사용하지 않아요. 2차원 좌표는 어떻게 될까 x y 0 1 이렇게 표현을 해요. 내부적으로는 굳이 2차원과 3차원을 나누지 않고 3차원 위주로 해요. 그래서 2차원은 z가 0일 때 이렇게 생각을 할 수가 있겠죠. 그래서 오픈 지열에서 정점의 좌표 정점의 좌표는 우리 정점의 좌표 지정하는 함수 뭐 있죠? GL 버텍스라는 함수 있었죠. 저주 버텍스 3 f 혹은 2 d 그런 거 있었죠. 그래서 그런 것들은 다 이제 동차 좌표 형태로 표현이 된다는 얘기예요. GL 버텍스로 정의하는 좌표는 내부적으로는 다 뭐가 된다 동체 좌표
出席人数 1 00:00 在 OpenGL 中,顶点是点的坐标。因此,点的坐标在内部使用齐次坐标。如果假设是 2 维,则为 x y 1,如果是 3 维,则为 x y z 1。事实上,2 维坐标也不使用。2 维坐标是如何表示的呢?x y 0 1。在内部,不特意区分 2 维和 3 维,主要以 3 维为主。所以 2 维可以认为是 z 为 0 的情况。在 OpenGL 中,指定顶点坐标的函数是什么?GL 顶点函数,对吧?如 GL Vertex3f 或 GL Vertex2d 等。这意味着通过 GL 顶点定义的坐标在内部都表示为齐次坐标。

Attendees 1 01:40 이렇게 GL 버텍스 2f에서 3.0 콤마 5.0 지정하면은 내부적으로는 이게 어떻게 된다는 얘기예요. 동체 좌표로 표현되면은 3 5 0 1 이렇게 표현된다는 얘기죠. 이렇게 표현이 돼서 이제 오픈지 그래 파이프라인으로 전달이 된다는 얘기예요. 그럼 얘가 누구랑 목해질까 변한 행렬들하고 곱해져요. 변한 행렬들
与会者 1 01:40 如果在 GL 顶点 2f 中指定 3.0,逗号 5.0,内部实际上是这样的。如果用齐次坐标表示,就是这样表达:3 5 0 1。这样表达后就会通过 OpenGL 管线传递。那么它会与哪些矩阵相乘呢?变换矩阵。

Attendees 1 02:15 그래서 각 정점의 좌표들은 즉 지엘 버텍스 별표로 지정하는 좌표들은 오픈 지엘 내부에 있는 4바이 4 모델 뷰 행렬이라는 게 있어요. 4 바이 4 4행 자열 자리 모델 뷰 행렬이라는 게 있는데 이 모델 뷰 행렬이 하는 역할이 바로 뭐냐 하면은 이동 그다음에 뭐 배웠죠. 회전 스케일 그다음에 밀림은 없어요. 사실 밀림 변화는 없고 이동 회전 스케일 요 세 개의 변환의 결과를 담고 있는 행렬이 모델도 행렬이에요. 그래서 요 행렬과 곱해진다 이렇게 해석을 하면 되고 예를 들면은 이제 어떻게 되는 건가 이게 모델 비행렬의 한 예가 되겠죠. 모델 비행렬은 동차 행렬일까요? 당연히 동차 행렬이겠죠. 왜 어파인 변환을 표현하는 행렬이니까 그래서 이게 뭐가 된다 000 1이라는 값을 갖게 되고 여기에 들어가는 요소는 어떤 것과 관련이 있을까? 3차원 공간에서 이동과 관련이 있어요. 그다음에 여기에 들어가는 거는 뭐 하고 관련돼 있을까요? 회전과 스케일과 또 밀림까지 이제 반영을 할 수도 있겠죠.
与会者 1 02:15 所以每个顶点的坐标,即用 GL 顶点指定的坐标,在 OpenGL 内部有一个 4×4 的模型视图矩阵。这个 4×4 的 4 行矩阵的模型视图矩阵的作用是什么呢?是平移,然后我们学过什么?旋转、缩放,实际上没有错切。错切变换是不存在的,模型视图矩阵包含的是平移、旋转、缩放这三种变换的结果。所以它会与这个矩阵相乘。举个例子,这就是模型视图矩阵的一个示例。模型视图矩阵是齐次矩阵吗?当然是齐次矩阵,因为它是表示仿射变换的矩阵。所以它会有 000 1 这样的值,这里的元素与什么有关?与三维空间中的平移有关。接下来,这里的元素与什么有关?与旋转、缩放,甚至可以反映错切变换。

Attendees 1 03:41 들어와 누구세요? 바람이에요 참 소심한 바람이에요.
参会者 1 03:41 进来了,你是谁?是风,一个非常害羞的风。

Attendees 1 04:07 그래서 이 행렬과 p 제로라는 동체 좌표가 곱해져서 p 제로 프라임으로 변환이 되고 p1이 곱해져서 p1 프라임으로 p2가 곱해져서 p2 프라임으로 이렇게 변환이 일어난다는 얘기예요. 그러면은 이런 만약에 이런 4로 표현된 이거 뭘로 그리면 되나 p 제로 p1 p2 p 코를 라인 뭘로 그리면 돼요? 라인 스트립으로 그리면 되죠. 라인 스트립으로 p 제로 p1 p2 pp 좌표를 지정해 주고 GL b긴 추의 엔드 사이에 라인 스트립 넣어주면 이렇게 그려지겠죠. 이렇게 그린 거가 이 좌표가 어떤 변환을 하게 되면은 모델 백렬을 곱해지게 되면은 어딘가에 이렇게 다른 변환이 되겠죠. 그래서 이거 같은 경우는 봤더니 어떤 변환으로 돼 있을까요?
参会者 1 04:07 所以这个矩阵与 p 零的物体坐标相乘,转换为 p 零质点,然后乘以 p1 转换为 p1 质点,乘以 p2 转换为 p2 质点,就是这样的转换。那么,如果用 4 表示这个,要如何绘制呢?p 零、p1、p2、p 坐标可以用线条如何绘制?可以用线条连接(Line Strip)。通过指定 p 零、p1、p2、p 坐标,并在 GL b 的端点之间插入线条连接,就可以这样绘制。如果这些坐标经过某种变换,乘以模型矩阵,就会转换到其他位置。那么在这种情况下,它会发生什么样的变换呢?

Attendees 1 05:01 이동 변환 1 x축으로 1 y 축으로 2 이동 변환 후에 아마 제 축으로 반시계 방향으로 45도 회전하는 회전 변환 여기 이동 변환이 있고 회전 변환이 아마 여기 들어 있는 행렬이 될 거예요. 그래서 그 행렬과 얘네들의 잡초를 곱해주면은 이렇게 나오게 되는 거죠.
与会者 1 05:01 移动变换 1 沿 X 轴 1 沿 Y 轴 2 移动变换后,可能是沿 Z 轴逆时针旋转 45 度的旋转变换。这里有移动变换,旋转变换,可能这些矩阵就在这里。所以将这个矩阵与它们相乘,就会得到这样的结果。

Attendees 1 05:31 자 그러면 조금 더 자세하게 보면은 오픈 지열에서 변환 행렬은 변환 행렬은 아까 모델 뷰 행렬로 표현이 된다고 했죠. 자 모델 뷰 행렬은 1차원 배열로 저장되는 상태 변수 우리 상태 변수 기억나나요? 오픈gl은 여러 가지 상태 변수를 가지고 있는데 그중에 이제 모델 비행률도 상태 변수이다라고 초반부에 얘기를 했던 것 같아요. 그래서 모델 행렬도 상태 변수고 4 바이 4 행렬이지만 총 요소의 개수는 몇 개예요? 4 4 16 16개죠 그래서 내부적으로는 1차원 배열로 관리를 한다는 얘기예요. 모델 배열을 그다음에 얘는 칼럼 메이저예요. 칼럼 메이저 열우선순으로 저장이 된다는 얘기예요. 열 우선순위라는 얘기는 요 16개의 플롯 타입 배열이 바로 요 순서대로 첫 번째 0 번째 첫 번째 두 번째 세 번째 해서 이렇게 칼럼 무선으로 칼럼 무선으로 저장이 된다는 얘기예요. 만약에 뭐야 로우 매니저로 저장이 된다 하면 어떻게 되는 거예요? 0 1 2 3 4 이런 식으로 저장이 되는 거죠.
与会者 1 05:31 那么,更详细地看,在 OpenGL 中,变换矩阵是用模型视图矩阵表示的。模型视图矩阵是以一维数组形式存储的状态变量,还记得状态变量吗?OpenGL 有多种状态变量,其中模型矩阵也是状态变量,就像之前讨论的那样。因此,模型矩阵是一个状态变量,是 4x4 矩阵,总元素个数是多少?4x4 是 16 个。所以内部是以一维数组管理的。模型数组是列主序存储,意味着这 16 个浮点类型数组是按照这个顺序存储的:第 0 个、第 1 个、第 2 个、第 3 个,以列主序方式存储。如果是行主序存储,就会像 0 1 2 3 4 这样存储。

Attendees 1 06:56 그래서 이게 칼럼 메이저로 저장이 되는지 로우 메이저로 저장이 되는지를 여러분이 알아야지만이 내가 만약에 이 행렬을 얻어 구했어요. 실시간으로 이제 구했는데 이동 성분만 찾아내고 싶어요. 그럼 이 행렬에 몇 번째를 요소를 가져오면 되나요? 13 14를 가져오면 되죠. 근데 얘가 만약에 로우 메이저로 저장돼 있다고 하면은 0 1 2 3 4 5 6 7 3 7 1일 요소를 가져와야겠죠. 그래서 이게 로우 메이저로 저장돼 있냐 칼럼 메이저로 저장돼 있냐가 또 중요한 거겠죠. 그럼 실제 논리적으로 메모리에는 누가 누가 이웃해 있을까
所以这是以列主序还是行主序存储的,你们必须知道。如果我现在获得了这个矩阵,实时获取,并且想要找出平移分量,那么我需要获取哪些元素呢?获取 13 和 14 即可。但是如果它是以行主序存储的,那么我就需要获取 0、1、2、3、4、5、6、7、3、7、1 这些元素。所以它是以行主序还是列主序存储确实很重要。那么在逻辑上内存中实际上谁和谁相邻呢?

Attendees 1 07:41 영어하고 이 이웃에 있겠죠. 이 순서대로 저장이 돼 있으니까
英语和这个相邻,因为它是按照这个顺序存储的。

Attendees 1 07:50 행렬을 행렬을 표현할 때 행렬을 표현할 때 이거 2차원 어레이로 표현하면 더 쉽지 않아요. 해서 플롯의 노델 뷰의 4 바이 4 이렇게 표현을 시작할 수도 있는데 대부분의 대부분의 대부분의 여러 가지 이제 소프트웨어나 라이브러리들은 2바이 2 2차원의 행렬을 1차원으로 표현을 많이 해요. 여러분들 을지 모르겠지만 아이겐 라이브러리라는 거 윈이나 일지브러에서 많이 쓰는 라이브러리도 보면은 이렇게 다 1차원으로 표현을 해요. 2차원으로 표현을 하고 1차원으로 관리를 하죠.
与会者 1 07:50 当表示矩阵时,如果用二维数组来表示会不是更容易吗。因此可以开始以 4 乘 4 模型视图的方式表示。但大多数软件或库都习惯将二维矩阵表示为一维。虽然您可能不知道,但像特征值库(Eigen 库)在 Windows 或其他库中也都是这样用一维来表示的。先用二维表示,然后用一维管理。

Attendees 1 08:34 그래야지 메모리에 한 번에 쭉 배열이 되기 때문에 여러분 지금은 아마 그런 생각 안 하지만 나중에 프로그램 큰 것들 많이 짜다 보면은 이 캐시 배웠죠. 캐시 캐시 히트가 난다 비스가 난다 그런 거 있죠. 그래서 이게 뭔가 내가 지금 다루는 데이터가 캐시에 한 번에 다 올라와 있는 있어야지만이 성능을 최대한 발휘를 할 수가 있어요. 근데 내가 다루는 데이터가 여기저기 메모리 힙에 분산이 돼 있으면은 그거 찾아가는 데 시간을 오래 소비를 해요. 그래가지고 캐시에 이렇게 올리는 게 좋은데 그러다 보면은 1차원 어레이로 뭔가 굉장히 만약에 이게 천 바위 천이었다. 어떤 행렬이 천 바위 천이면은 이게 천 몇 개가 돼요 총 100만 개 데이터가 되겠죠 100만 개 데이터가 쭉 일렬로 메모리에 한 군데 다 모여 있는 게 좋겠죠. 그게 여기저기 분산돼 있으면 안 좋아요. 아무튼 그러면은 오픈gl에서 모델 뷰 행렬이 저기 뭐야 기아 변환을 담당한다는 걸 알겠어요.
与会者 1 08:34 这样可以让数组一次性在内存中排列。现在您可能没有这种想法,但以后在编写大型程序时,您会学到缓存命中和缓存未命中等概念。因此,如果正在处理的数据能一次性全部载入缓存,就能发挥最大性能。如果处理的数据分散在内存堆的各处,就会花费大量时间去查找。如果是千乘千的矩阵,总共会有 100 万个数据,最好是这些数据都集中在内存的一个地方。如果数据到处分散,那就不好了。无论如何,现在我们知道 OpenGL 的模型视图矩阵负责几何变换。

Attendees 1 09:45 그리고 모델 뷰 행렬은 내부적으로 16개짜리 어레이로 표현된다는 것도 알겠고 칼럼 메이저로 저장된다는 것도 알겠어요. 그러면 현재 오픈 지열에 모델 행렬의 값을 얻어올 순 없을까 값을 얻어올 순 없을까 물론 있어요. 어떻게 GL 겟 플롯 v라는 함수를 이용하면 돼요. GL GL 함수네요. 게이라는 건 얻어오겠다는 거고 플롯 v 요 v는 뭘까 배열이라고 했었죠 v가 들어가면 그다음에 첫 번째 인자로 GL 언더바 GL 언더스코 모델 뷰 이렇게 나누고 두 번째 인자로 이 모델 뷰 행렬의 값을 얻어와서 어디다가 담아야겠죠? 그 담을 행렬을 여기다 넣어주면 돼요. 그래서 플롯 타입으로 m 16개짜리 배열을 정의를 하고 두 번째 인재로 그 배열에 이름을 넣어주면은 배열의 이름은 어떤 역할을 해요? CC불불에서 배열의 이름은 배열의 시작 주소 포인터 역할을 하죠. 그러면 이 함수 내부에서는 이 m에다가 이렇게 값을 넣어줄 거예요. 복사를 할 거예요.
参会者 1 09:45 并且知道模型视图矩阵在内部是用 16 个元素的数组表示的,并且以列主序存储。那么,现在可以获取 OpenGL 中模型矩阵的值吗?当然可以。可以使用 GL 获取绘制 v 函数。这是 GL 函数。获取意味着获取,v 是什么?我们之前说过是数组。如果 v 进入,然后第一个参数是 GL_GL_MODEL_VIEW,第二个参数是要存储模型视图矩阵的值。那么要将这个矩阵存储在哪里?你可以在这里放置要存储的矩阵。所以定义一个 float 类型的 m,16 个元素的数组,将数组名作为第二个参数。数组名在 C/C++中起什么作用?数组名是数组的起始地址指针。然后在函数内部,它会将值放入 m 中,进行复制。

Attendees 1 10:49 아마 현재 모델 메뉴에 복사를 그럼 얻어올 수가 있겠죠 그래서 모델 백렬을 얻어올 수 있고 그다음에 이제 모델 백렬을 여러분이 직접 조작을 할 수가 있어요. 조작 일단은 내가 모델 뷰 행렬 즉 변환 행렬을 조작하겠다고 선택을 해줘야 돼요. 그 선택하는 게 GL 메이트릭스 모드예요. GL 메이트릭스 모드. 그래서 내가 조작할 행렬을 선택하는데 우리 당분간은 모델 백뉴를 조작할 거니까 GL 언더바 모델 뷰를 넣어주면 돼요. 그다음에 아마 다음 시간 아니면 다음 시간에도 배우겠지만 프로젝션 행렬이라는 것도 있어요. 그럼 내가 프로젝션 행렬을 조작하고 싶다 하면은 GL 언더바 프로젝션 넣어주면 돼요. 그래서 이게 바로 조작할 행렬을 선택하는 거고 우리 아마 여러분 프로그램 템플릿 코드 있죠 거기 보면은 이게 이 코드가 아마 있을 거예요.
参会者 1 10:49 大概现在可以在模型菜单中复制,所以可以获取模型矩阵,然后你可以直接操作模型矩阵。首先,你需要选择要操作的变换矩阵。选择的方法是使用 GL 矩阵模式。GL 矩阵模式。因此,选择要操作的矩阵,我们暂时将操作模型视图矩阵,所以放入 GL_MODEL_VIEW。然后,可能在下一节课或之后的课程中,还会学习投影矩阵。如果你想操作投影矩阵,就放入 GL_PROJECTION。这就是选择要操作的矩阵,在你的程序模板代码中,可能已经有这段代码了。

Attendees 1 11:46 처음에 랜더링하는 부분 쥬엘 클리어 컬러 한 다음에 그 밑에 아마 쥬 메이트릭스 모드 한 다음에 프로젝션 선택하고 그다음에 로드 아이덴티티에서 단위 행렬로 초기화하고 그다음에 관측 공간 지정해줬죠. 관측 공간 지정해 줄 때 이런 함수를 사용을 했어요. 그다음에 보통은 이 모델 백렬을 이제 선택을 하면은 단위 행렬로 초기화하는 방법이 있어요. 그게 바로 GL 로드 아이덴티티라는 함수예요. 그래서 이 행렬을 이 함수를 호출하면은 지금 내가 선택한 행렬이 단위 행렬로 초기화가 돼요. 어떻게 이렇게 바뀐다는 얘기죠? 됐나요? 여기에 첫 번째 모델 비행렬을 조작하는 방식이고 그다음에 나는 모델 행렬이 이동 기능을 이동 변환을 하고 싶어 이동 변환을 담당하게끔 하고 싶어 하면은 어떻게 해 주면 될까 바로 GL 트랜슬레이트 f 혹은 GL 트랜슬레이트 d라는 함수를 호출하면 돼요. 이 함수를 호출하는데 아까 트랜슬레이트라는 거는 이동이라고 했었죠.
与会者 1 11:46 首先在渲染部分清除颜色,然后可能是设置矩阵模式,选择投影,然后加载单位矩阵并初始化,接着指定观察空间。指定观察空间时使用了这样的函数。然后通常当选择模型矩阵时,可以将其初始化为单位矩阵。这就是 GL 加载单位矩阵函数。调用此函数后,当前选择的矩阵将被初始化为单位矩阵。这是怎么改变的呢?明白了吗?这是第一种操作模型矩阵的方式。如果我想执行平移变换,想让模型矩阵负责平移,该怎么办?直接调用 GL 平移 f 或 GL 平移 d 函数即可。之前我们说过平移是平移。

Attendees 1 12:56 이동이고 txty tz를 인자로 넘겨주는데 tx는 x 축으로 이동량, y축 이동량, z축 이동량이에요. 그러면 이 함수를 호출을 하면은 내부적으로는 어떤 일이 발생할까? 오픈 j 코드에서 여러분이 이렇게 명령어를 넣어주면은 내부적으로는 이게 만들어지는 이런 행렬을 하나 만들어요. 이거 어떤 행렬이에요? txtyt 이동 변환 하는 행렬이죠. 그래서 이런 이동 변환 행렬을 만들고 현재 모델 비행률의 오른쪽에다 곱해줘요. 아까 현재 모델 백렬 뭘로 초기화 돼 있나요? 단위 행렬로 초기화했었죠 그래서 이 단위 행렬 현재 모델 백렬을 행렬의 오른쪽에다가 요 이동 변환 행렬을 내부적으로 만들어서 두 개를 곱하고 곱한 결과를 뭘로 업데이트해 줄까 모델 행렬로 업데이트해줘요. 그래서 모델 백행렬은 기존의 모델 백렬 곱하기 이동 변환 행렬 이런 식으로 그러면 이제 현재 모델 백렬은 이런 형태가 되겠죠.
与会者 1 12:56 平移,传入 txty tz 作为参数,tx 是 x 轴平移量,ty 是 y 轴平移量,tz 是 z 轴平移量。调用此函数时,在 OpenGL 代码中,内部会创建一个这样的矩阵。这是什么矩阵?是 txtyt 平移变换矩阵。创建这个平移变换矩阵后,将其乘到当前模型矩阵的右侧。之前模型矩阵是什么初始化的?是单位矩阵。所以在内部创建这个平移变换矩阵,将两者相乘,乘积将更新为模型矩阵。因此,模型矩阵将变成现有模型矩阵乘以平移变换矩阵。这样,当前模型矩阵就会变成这种形式。

Attendees 1 14:05 뭔가 이동 변환을 해주는 그래서 여러분들이 뭔가 객체를 그리고 객체를 지금 우리 옛날에 원 하나 그렸죠 원 하나 그리고 만약에 원을 원의 중심을 이동을 하고 싶다 하면 어떻게 했어요? cxcy 줬었죠? 그렇게 안 하고 GL 트랜슬레이트 한 다음에 여러분이 위치하고 싶은 원의 중심으로 이동을 시키고 그다음에 그냥 드로우 서클에서 원점에서 그리면 돼요. 그러면 이제 원이 로컬 좌표계가 그쪽으로 이동을 한 다음에 그 좌표계에서 원을 그리는 거예요. 그럼 이동 변환 효과가 나오겠죠
与会者 1 14:05 提供一个移动变换,所以你们绘制了一个对象,我们之前绘制了一个圆。如果你想移动圆的中心,以前是如何做的?给定了 cxcy 对吗?不这样做,使用 GL 平移,然后移动到你想要的圆的中心位置,然后直接在原点绘制圆就可以了。这样,局部坐标系就会移动到那个位置,然后在该坐标系中绘制圆。这样就会产生移动变换的效果。

Attendees 1 14:45 트랜슬레이트만 되나 로테이트도 되겠죠 로테이트 축 VX vy v z 3차원 공간의 축이에요. 이 축을 중심으로 보통 축이 있으면은 그걸 엄지손가락으로 딱 가리키게 되면은 오른손이 향하는 방향이 회전 방향이에요. 그럼 반식의 방향이 되겠죠 VX vy vz를 중심으로 반식의 방향으로 세타만큼 앵글만큼 회전을 시키는 회전 행렬을 만들고 싶어요. 어떡하 GL 로테이트 f f는 뭐고 d는 뭔가 앞에도 마찬가지지만 f는 풀 타입으로 지정해 주는 거고 뒤는 더블 타입으로 해주는 거예요. 아무튼 주에 로테이트 별표를 호출하고 첫 번째 인자로 앵글 값을 주고 두 번째 세 번째 네 번째 인자로 회전축을 주는 거예요. 그전 축 그러면 우리 요게 어떤 공식 혹시 기억나는지 모르겠는데 임의의 축을 기준으로 만드는 로테이션 매트릭스 있죠.
与会者 1 14:45 不仅仅是平移,还能旋转。旋转轴为 Vx、Vy、Vz,是三维空间中的轴。通常当有轴时,用拇指指向轴,右手的方向就是旋转方向。那么反方向就是相反的方向。我们想围绕 Vx、Vy、Vz 轴以θ角度进行旋转,创建旋转矩阵。GL 旋转的 f 和 d 是什么?与前面一样,f 是浮点类型,后面是双精度类型。无论如何,调用旋转,首先传入角度值,然后第二、第三、第四个参数传入旋转轴。那么,你还记得关于任意轴旋转矩阵的公式吗?

Attendees 1 15:53 요거 요 공식으로 만들어지는 회전 행렬 있죠. 그 회전 행렬을 내부적으로 만들어요. 그럼 회전 행렬을 만들어 가지고
与会者 1 15:53 这是使用这个公式创建的旋转矩阵,对吧。他们在内部创建旋转矩阵。然后制作旋转矩阵

Attendees 1 16:09 요 축을 기준으로 몇 도만큼 앵글만큼 돌아가는 회전 행렬을 만들어서 그래서 이 앵글은 회전 각도예요. 그리고 다행스러운 건 이 회전 각도를 라디아 값으로 안 주고 그냥 디그리 값으로 줄 수 있어요. 90도 30도 60도 편하게 그다음에 이 함수는 또 사용자의 편의를 봐줘서 이거를 원래는 공식에 대입하려면 이게 어때야 돼요? 단위 벡터야 되죠 길이가 길이가 1이어야 되는데 여기서 이제 굳이 길이를 1로 안 맞춰줘도 돼요. 왜 요 함수 안에 들어가면은 길이를 1로 맞출 거예요. 이거 아마 굳이 이거 길이를 1로 맞추는 거 사용자한테 부담을 줄 필요는 없겠죠. 그래서 1 1 1이라고 넣어줘도 되고 또 어떻게 3 3 3이라고 넣어줘도 되고 같은 결과가 나온다는 얘기예요. 그래서 이 함수가 하는 역할은 회전 행렬 r을 공식에 의해서 만들어서 만들어서 현재 모델 배행렬 현재 모델 배행렬은 누구예요?
与会者 1 16:09 围绕这个轴旋转特定角度的旋转矩阵。这个角度是旋转角度。幸运的是,这个旋转角度可以直接用度数表示,而不是弧度值,可以轻松地输入 90 度、30 度、60 度等。此外,这个函数为用户提供了便利。原本在公式中,这个向量需要是单位向量,长度应该为 1,但在这个函数中,你甚至不需要手动将长度调整为 1。函数内部会自动处理。因此,用户不需要为此感到负担。例如,你可以输入 1 1 1,或者 3 3 3,都会得到相同的结果。这个函数的作用是根据公式创建旋转矩阵 R。那么,当前的模型矩阵是什么?

Attendees 1 17:13 지금 아까 트랜슬레이션 했으면 이런 이게 이제 현재 모델 행렬이겠죠. 이 행렬에 오른쪽에 또 곱해주는 거예요. 오른쪽에 곱해서 예제로는 이거 뭐 한 건가 이거는 만약에 이런 행렬을 만든다 하면은 이거는 z 축 기준으로 회전한 거니까 여기에는 뭐가 들어가야 돼요? 001이 들어가면 되겠죠. 그다음에 앵글에는 적당히 이제 세타가 들어가면 되겠죠. 그래서 세타 001 하면 아마 이런 행렬이 만들어질 거예요. 이 행렬을 현재 모델 행렬의 오른쪽에 도급한다. 현재 모델 명렬 오른쪽에 곱한다는 얘기는 계속 왼쪽에서 오른쪽으로 곱해 나간다는 얘기죠. 지금 그래서 로컬 좌표계로 해석을 하겠다는 얘기예요. 그러면은 뭐가 될까 그 결과를 이렇게 결과를 했더니 이렇게 되는데 이 결과를 현재 모델 변렬로 업데이트시키겠죠. 자 트랜스레이트 로테이트 남은 거 뭔가 스케일 스케일은 함수의 이름이 뭘 것 같아요?
与会者 1 17:13 如果现在已经进行了平移,那么这就是现在的模型矩阵。我们在右侧再乘以矩阵。右侧乘以矩阵,例如,如果创建这样的矩阵,这是绕 Z 轴旋转,那么这里应该填什么?001 应该可以。然后角度可以填入适当的θ。所以θ 001 大概会形成这样的矩阵。将这个矩阵乘到当前模型矩阵的右侧。在右侧乘以当前模型矩阵意味着从左到右持续相乘。现在,这是要解释为局部坐标系。那么结果会是什么呢?结果是这样,这个结果将更新为当前模型矩阵。好的,平移、旋转,剩下的是什么?缩放,缩放函数的名称可能是什么?

Attendees 1 18:15 GL 스케일 f 혹은 뭐 스케일 d가 되겠죠 스케일 변환 GL 스케일 f d 그다음에 x축 스케일 y축 스케일 지축 스케일 이 함수가 하는 역할은 뻔하겠죠. 스케일 변환 행렬 s를 생성을 해서 현재 모델 행렬의 우측에 곱하고 그 결과를 현재 모델 행렬로 업데이트를 시켜주는 거죠. 그래서 내부적으로는 어떤 행렬 sx sy g라는 행렬이 만들어지고 현재 모델 경향을 얘라고 가정을 했을 때 트랜슬레이션 로테이션 해서 얘라고 가정을 했을 때 오른 팔에다 곱해서 곱하면 아마 이런 결과가 나오게 될 거예요. 이런 식으로 곱해지게 되는 거고 얘가 이렇게 현재 모델 변형이 되는 거죠.
与会者 1 18:15 GL 缩放 f 或者 GL 缩放 d,缩放变换,GL 缩放 f d,然后是 X 轴缩放、Y 轴缩放、Z 轴缩放。这个函数的作用很明显。生成缩放变换矩阵 S,并将其乘到当前模型矩阵的右侧,然后将结果更新为当前模型矩阵。因此,内部会生成一个 Sx Sy Sz 矩阵,假设当前模型矩阵是这个,经过平移和旋转,假设是这个,在右侧乘以,大概会得到这样的结果。就是这样相乘,然后这就成为当前模型变换。

Attendees 1 19:07 전체적인 내용은 알겠죠 근데 이제 실제 프로그래밍을 하다 보면 어떻게 되는지는 좀 해봐야겠죠. 프로그램하고 이게 정확하게 어떻게 연관이 되는지는 아직 감이 안 잡힐 수도 있어요. 조금만 더 행렬 조작 함수를 몇 가지 살펴보면은 지금까지 배운 g 트랜슬레이트 로테이트 쥬 스케일은 트랜슬레이션 로테이션 스케일 행렬을 만들어서 현재 모델 백렬의 오른쪽에 곱해주는 거였죠. 그거 말고 내가 만약에 현재 모델 백렬을 바로 뭔가 다른 행렬로 리플레이스 하고 싶어요. 적재를 하고 싶어 그럴 때 사용하는 게 GL 로드 메이트릭스라는 함수예요. 그래서 로드 메이트릭스 한 다음에 어떤 배열에 이름을 넣어주게 되면은 그 배열이 가지고 있던 값을 현재 모델 배행률의 값으로 그냥 바로 업데이트를 시켜줘요. 그래서 현재 선택된 행렬 우리는 지금 모델 행렬을 생각하고 있죠. 임의의 행렬 m으로 변경을 하는 게 GL 로드 메이트릭스라는 함수고 그다음에 GL 멀티메이트릭스 f는 뭘까 멀티플레이 하는 거죠.
参会人员 1 19:07 整体内容大家都懂了,但是实际编程中具体会怎样还需要实践。可能还不太清楚程序和这些具体是如何关联的。稍微再看看几个矩阵操作函数,我们之前学习的平移、旋转、缩放是通过创建平移、旋转、缩放矩阵并将其乘到当前模型矩阵右侧。除此之外,如果我想直接将当前模型矩阵替换为另一个矩阵,想直接加载。这时就会用到 GL 加载矩阵函数。当你将某个数组名称传入加载矩阵函数后,该数组的值就会直接更新为当前模型矩阵的值。所以 GL 加载矩阵函数是用任意矩阵 M 来更改当前选定的矩阵,我们现在考虑的是模型矩阵。那 GL 多矩阵函数是做什么的呢?就是乘法。

Attendees 1 20:21 현재 모델 행렬에 내가 임의로 지정하는 행렬을 곱해 주는 거예요. 오른쪽에 현재 선택된 행렬의 우측에 임의 행렬 m을 곱하는 역할을 해주는 게 GL 멀티 메이트릭스 불안 함수고 그다음에 GL 푸시 팝 매트릭스가 있어요. 푸시 팝 푸시 팝 하면은 뭐가 생각나요? 자료 구조 스택이죠. 스택 스택 스택 스택 하면은 또 뭐가 생각이 나요? 스텝 포인터가 생각이 나죠 스텝 스텝 포인터 얘가 현재 모델 비행렬이라고 가정을 할게요. 얘가 현재 모델 비행렬인데 지금 스택이 이렇게 있다고 가정을 할게요. 그러면은 푸시 하면 뭐가 될까 푸시 스택에다가 현재 모델 배뉴를 하나 복사를 해줘요. 복사를 하고 스텝 포인트를 여기를 지키도록 하겠죠. 스텝 포인트를 여기를 가리키도록 할 거예요 그게 어떤 역할이다? GL 푸시 메이틱스가 하는 역할이에요.
参会人员 1 20:21 是将我指定的矩阵乘到当前模型矩阵上。在当前选定矩阵的右侧乘上任意矩阵 M,这就是 GL 多矩阵函数的作用。然后还有 GL 推送弹出矩阵。提到推送弹出,你会想到什么?数据结构中的栈。提到栈,又会想到什么?栈指针。假设栈指针就是当前模型矩阵。现在假设栈是这样的。那么推送时会发生什么?在栈中复制当前模型矩阵。并将栈指针移动到这个位置。这就是 GL 推送矩阵函数的作用。

Attendees 1 21:26 다시 현재 선택된 행렬을 복사하여 현재 선택된 행렬이 얘라고 가정을 했을 때 얘를 하나 복사해서 스펙에 넣어주고 스택 포인트를 하나 증가시키겠죠. 이거 왜 할까? 왜 스택에다 보관을 시킬까? 내가 이제 얘를 막 바꾸고 싶은 거야. 얘 얘한테 얘를 가지고 얘를 가지고 다른 연산들을 막 적용을 해가지고 여기에다가 트랜슬레이션도 하고 로테이션도 하고 뭐야 셰어링도 하고 다 해가지고 얘를 변경시키고 싶은 거야. 그다음에 변경시킨 다음에 다 썼으면은 이제 뭐 하고 싶어요? 다시 변경되기 전 행렬로 돌아가고 싶죠. 그럴 때 변경 원래 행렬을 스펙에 다 하나 넣어두고 내가 마음대로 쓰고 그다음에 어떤 함수 호출해 주는 거예요 팝 메이틱스 해 주면은 팜 매트릭스 해주면은 스펙 행렬에서 스펙의 행렬을 빼서 스펙의 행렬 현재 여기 스텝 포인트가 어디를 가리키고 있었어요? 얘를 가리키고 있었죠. 얘를 하나 빼가지고 다시 모델 백렬로 업데이트를 해주는 거예요.
与会者 1 21:26 再次复制当前选定的矩阵,假设当前选定的矩阵是这个,将它复制到规格中,并增加堆栈指针。为什么要这样做?为什么要保存在堆栈中?我现在想要改变它。我想对它进行各种操作,比如平移、旋转、剪切等,并对其进行修改。然后在修改后,当我用完了,我想要回到修改前的矩阵。这时就会将原始矩阵放入规格中,我可以随意使用,然后调用弹出矩阵函数,从规格矩阵中弹出矩阵,堆栈指针当前指向哪里?它原本指向这里。弹出一个,然后将模型矩阵更新回来。

Attendees 1 22:42 그다음에 스텝 포인트는 어디로 갈까 얘를 가리키겠죠. 하나가 빠지니까.
与会者 1 22:42 然后堆栈指针将移动到哪里?它将指向这个。因为弹出了一个。

Attendees 1 22:51 그래서 푸시 팝 푸시 팝 푸시 팝 이거는 사실 이제 로컬 코디네이트를 현재 좌표계를 저장한다라는 개념과 마찬가지예요. 현재 좌표계를 저장했다가 막 딴 데로 가서 뭔가 작업을 하고 다시 현재로 돌아오고 싶으면 어떻게 해요? 팝해주면은 저장했던 위치로 돌아오게 되는 거죠. 알겠나요?
参加者 1 22:51 所以推送和弹出其实就像是保存当前坐标系的概念一样。如果你想保存当前坐标系,然后去其他地方做一些操作,之后又想回到原来的位置,该怎么办呢?当你弹出(pop)时,就会回到之前保存的位置。明白了吗?

Attendees 1 23:16 그래서 간단한 오픈 제 프로그램 두 개 정도만 살펴볼 건데 드로우 오브젝트라는 함수는 뭘 그리는 거냐 하면은 아까 수업 시간에 얘기했듯이 이제 4자를 그리는 함수예요. 사자를 그리는 함수인데 RGB를 받네요. RGB를 받아서 GL 라인 이드스에서 3.0 라인 두께를 한 3픽셀 정도로 하고 그다음에 GL 칼러 3f에서 지정한 색상으로 지정을 해주고 라인을 3개를 그리는데 010 하면 어디예요? 010 010 하면 62가 되겠죠 맨 위쪽 010에서 어디 마이너스 1 00이니까 여기로 라인을 그려요. 첫 번째 라인. 물론 이거 라인 스트립으로 한 번에 그릴 수도 있지만 따로따로 그렸어요. 여기 첫 번째 라인,
参加者 1 23:16 所以我将简单地查看两个 OpenGL 程序,DrawObject 函数是用来绘制什么呢?就像之前课堂上讨论的,这是一个绘制字符的函数。它是一个绘制狮子的函数,并且接收 RGB 值。接收 RGB 值后,在 GL 线 ID 中设置线宽为大约 3 像素,然后在 GL 颜色 3f 中指定颜色,绘制 3 条线。如果是 010 010,那么就是 62。从最上面的 010 到负 1 00,绘制第一条线。当然,这也可以用线带一次性绘制,但这里是分开绘制的。这是第一条线。

Attendees 1 24:11 두 번째 라인은 어디를 그리나요? 마이너스 1 00에서 0.500이니까 이게 두 번째 라인이 되겠죠. 그다음에 세 번째 라인은 010에서 0 마이너스 0.70이니까 이게 이제 세 번째 라인이 되는 거죠. 4자를 그린 이유는 동선 안묵을 명확하게 판단하기 위한 거예요. 이 사자의 요 짧은 쪽이 이제 x축이 되는 거예요. 그다음에 이쪽이 y 축이 되겠죠. 그래서 사자는 어떻게 놓이든 간에 명확하게 x y 축을 여러분이 판단할 수가 있겠죠.
参会人员 1 24:11 第二条线绘制在哪里?从负 1.00 到 0.500,这就是第二条线。然后第三条线从 0.10 到 0 负 0.70,这就是第三条线。绘制 4 条线的原因是为了清楚地判断动线安墨。这个狮子的短边现在成为 x 轴。然后这一侧成为 y 轴。所以无论狮子如何放置,你都可以清楚地判断 x 和 y 轴。

Attendees 1 24:53 얘를 가지고 만약에 이런 코드가 있다. 이런 코드가 있으면은 출력 결과를 여러분이 잘 상상을 할 수 있어야 돼요. 랜더 플로우라는 함수는 그냥 여기 바닥에 바닥 선을 그려주는 함수라고 가정을 할게요. 그리드 라인을 그려주는 거고 그다음에 실제 여러분이 이제 판단해야 되는 건 여기서부터겠죠. 드로우 오브젝트에서 드로우 오브젝트에서 이건 무슨 색이에요? 110이니까 노란색이죠. 노란색으로 그려주면은 현재 좌표에는 어디일까 현재 좌표에 드로 오브젝트 1번 드로 오브젝트가 호출되는 현대 좌표에는 현대 좌표에 아무것도 안 했죠. 그러니까 여기 센터에다 이제 4가 그려질 거예요. 4가 4가 이렇게 그려지고 걔를 0번 자평이라고 할까요? 편의상 그다음에 푸시 메이틱스 했어요. 푸시 메이트릭스 푸시 메이틱스 하면은 스펙에 스택에 스택이 이렇게 있다고 하면은
参会人员 1 24:53 如果有这样的代码。如果有这样的代码,你需要能够很好地想象输出结果。假设渲染流程函数只是在底部绘制底线,绘制网格线,然后实际上你需要判断的是从这里开始。在绘制对象中,绘制对象中,这是什么颜色?110 所以是黄色。如果用黄色绘制,那么在当前坐标上会在哪里?在绘制对象 1 的当前坐标上,目前什么都没做。所以现在会在中心绘制 4。4 会这样绘制,我们暂且称之为 0 号坐标系。然后进行推送矩阵。如果进行推送矩阵,假设堆栈是这样的话。

Attendees 1 26:06 스택에 저장되는 좌표기는 몇 번 좌표기가 저장이 되는 거예요? 0번 좌표기가 저장이 되고 스텝 포인트는 여기를 가리키겠죠. 그래서 불안해하지 않고 스택에 명분 자개를 저장을 했어요. 그래서 나는 언제든지 어디로 돌아올 수 있다 0번 자개로 돌아올 수 있다는 얘기예요. GL 트랜슬레이트 f 이거 어떤 행렬이에요? 이동 행렬을 만들어서 현재 모델 행렬에 곱해주는 거죠. 그러면은 지금 이 현재 모델 행렬이 단위 행렬이었는데 여기 트랜슬레이트 하면 이동 행렬이 만들어져서 오른편에 곱해지니까 로컬 코디네이트가 하나가 계속 만들어지는 거라고 생각해도 되겠죠. 그러면은 코디에이트가 어디로 갈까? 2 3이면은 x축으로 2 y축으로 3 하면은 이렇게 되겠네요. 좌표기가 여기서 여기로 온 거예요 누구에 의해서 GL 트랜슬레이트 f에 의해서 그다음에 여기서 뭘 그려요? 드로우 오브젝트 1 빵빵 하면은 이거는 4자를 빨간색으로 그리라는 얘기죠.
与会者 1 26:06 存储在堆栈中的坐标是第几个坐标被存储?0 号坐标被存储,步骤指针指向这里。所以不用担心,将有效的坐标保存在堆栈中。这意味着我随时可以返回,可以返回到 0 号坐标。GL 平移 f 是什么矩阵?创建平移矩阵并将其乘到当前模型矩阵。现在当前模型矩阵是单位矩阵,平移后会创建一个平移矩阵,并乘到右侧,可以认为局部坐标不断被创建。那么坐标会移动到哪里?如果是 2 3,那么 x 轴移动 2,y 轴移动 3。坐标从这里移动到那里,是由 GL 平移 f 引起的。然后在这里绘制什么?绘制对象 1,这意味着用红色绘制 4 个字。

Attendees 1 27:22 이 사자를 빨간색으로 정말 그렸네 그렇죠 자 그다음에 또 푸시를 했어요. 그러면 이제 누구를 저장시키는 건가 1번 좌표에 요 위치를 저장을 시키는 거죠. 푸시 메이트릭스 하면은 여기는 뭐가 들어간다? 1번 좌표기가 들어가고 그다음에 현재 스텝 포인트는 어디로 업데이트 돼요? 이쪽을 가리키겠죠
与会者 1 27:22 确实用红色绘制了这个字,对吧。接下来又进行了压栈操作。现在要保存什么?将当前位置保存到 1 号坐标中。压栈矩阵时,这里会存入什么?1 号坐标会被存入,然后当前步骤指针会更新到哪里?它会指向这一侧。

Attendees 1 27:49 요 스텝 포인트는 사라지고 여기를 가리키는 스텝 포인트가 되고 그다음에 여기서 GL 트랜슬레이트 f 마이너스 4 마이너스 2 해줬어요. 여기서 마이너스 4 한 칸 두 칸 세 칸 네 칸 마이너스 2 한 칸 두 칸 그럼 여기로 온 거죠 여기 여기로 온 상태에서 그다음에 뭐 해줬어요? z 축을 기준으로 40으로 회전시켜줬죠. 그러면은
听众 1 27:49 这个步骤点消失了,这里指向的步骤点出现,然后在这里进行了 GL 平移,减 4 减 2。这里减 4 一步、两步、三步、四步,减 2 一步、两步,然后就到了这里。在这里的状态下,接下来做了什么?绕 Z 轴旋转了 40 度。那么

Attendees 1 28:23 여기까지 수행이 됐고 2번 자하기는 정의가 되면 어떻게 돼요? 이쪽이 x 축이 되고 이쪽이 y 축이 되는 거죠. 그래서 여기서 초록색으로 초록색으로 드로우 오브젝트를 호출하면은 이렇게 4자가 들 거예요. 45도 회전된 상태로 그다음에 팝 메이틱스에서 팝 했어요. 그러면은 이제 현재 모델 행렬이 누가 복원이 될까요? 어디로 돌아오는 거예요? 1번을 다시 현재 모델 행렬로 바꾸는 거죠. 그러면은 1번이 지워지는 게 아니라 스펙 포인터가 그냥 여기만 가리키는 거죠. 스텝 포인터가 여기를 가리키는 거고 왜 스택의 자료 구조상 그런 거죠.
听众 1 28:23 这里已经执行完毕,第 2 次下笔定义后会怎样?这边变成 X 轴,那边变成 Y 轴。所以在这里用绿色绘制对象时,将会是 4 个字。旋转了 45 度,然后在弹出矩阵后。那么现在当前模型矩阵将会恢复到哪里?会返回到哪里?重新将模型矩阵切换回第 1 个。那么第 1 个并不会被删除,而是步骤指针仅仅指向这里。步骤指针指向这里,这是因为栈的数据结构特性。

Attendees 1 29:16 그다음에 현재 위치는 어디예요? 1번 좌표계로 돌아온 거예요. 일본에서 여기 갔고 회전했다가 뭐 했다가 여러 가지 막 일을 했다가도 팝 하면 다시 어디로 온다 여기로 오게 되는 거죠. 1번으로 복귀하고 어 여기서 또 트랜슬레이터네요. 1 마이너스 4 0 그래서 1 마이너스 4 하나 둘 셋 넷 여기로 온 거예요. 현재 접수는 이렇게 x y가 되는 거죠. 거기서 뭐 했어요? 제 방향으로 마이너스 90도 회전하네요. 그럼 어떻게 될까? x 축이 이렇게 있고 y 축이 있는데 마이너스 90도니까 시계 반응 우회전하는 거죠. 그러면은 이쪽이 x 좌표가 되고 이쪽이 y 좌표가 되겠네요. 그렇게 간 다음에 사자를 하나 더 그렸어요. 무슨 색으로 0 1 1 하니까 사이언 색이 그려지겠죠 사자를 하나 더 그리고 사자를 하나 더 그리고 잠깐만 지금 좌표에는 어디 있는 거예요? 지금 3번으로 와 있는 거죠. 그다음에 여기서 팝 미트릭스 했어요.
然后当前位置在哪里?返回到第 1 个坐标系。从日本到这里,进行了旋转等各种操作,当弹出时又回到这里。回到第 1 个坐标,哦,这里又是一个平移。1 减 4 0,所以 1 减 4,一二三四,到这里来。当前接收就是这样的 x y。在那里做了什么?向我的方向逆时针旋转 90 度。那会怎么样?当 x 轴在这里,y 轴在这里,由于是负 90 度,就是顺时针旋转。那么这边将成为 x 坐标,这边将成为 y 坐标。然后又画了一个狮子。颜色为 0 1 1,所以会画出青色的狮子,再画一个狮子,再画一个狮子。稍等,现在坐标在哪里?现在已经到第 3 个坐标了。然后在这里进行了弹出矩阵操作。

Attendees 1 30:33 그럼 어디로 복귀되나 현재 모델 백렬을 스텝 포인트 가리키고 있는 얘를 다시 복사를 하는 거죠. 그럼 다시 어디로 복귀가 된 거예요? 0번 좌표기로 복귀가 된 거죠. 이렇게 지금 2D 간단한 2D 예를 보여줬지만
那么会回到哪里?重新复制当前模型的基点指向的对象。那么又回到哪里?回到第 0 个坐标系。就这样,现在展示了一个简单的 2D 示例。

Attendees 1 30:53 뭐 이런 앵글을 만약에 변수로 지정을 했다고 가정을 할게요. 변수로 지정을 했다고 가정을 하면은 각자 이렇게 막 돌아가고 뭐 그렇게 되겠죠. 여기를 중심으로 해서 그래서 뭔가 좌표계가 좌표기가 계층 구조로 이렇게 이루어지게 될 거예요. 푸시 팝을 잘 쓰면은 지금 다 어떤 좌표기로 해석을 했어요 코드를 위에서부터 아래로 이렇게 읽었죠. 위에서부터 아래로 읽는다는 얘기는 현재 모델 행렬이 있고 그 뒤 오른쪽에 곱해지고 곱해지고 곱해지고 곱해지고 되는 거죠. 그러면 왼쪽에서 오른쪽으로 해석하는 방식이었죠 그러면은 어떤 코디네이트를 쓴다는 얘기예요? 지역적 표계를 계속 쓴다는 얘기예요. 그래서 코딩을 할 때는 위에서부터 아래로 코딩을 하니까 왼쪽에서 오른쪽으로 해석하는 방식이니까 지역적 표계로 해석하는 게 편해요. 이런 거 보면 이제 뭐 하고 싶어요? 뭔가 아티큘레이티드 된 객체를 모델링 한번 해보고 싶죠. 아티큘레이티드된 객체라는 게 뭐예요?
假设我们将这个角度指定为变量。如果将其指定为变量,那么它们会各自旋转等。以此为中心,坐标系将形成一个分层结构。如果正确使用推送和弹出,我们就能按从上到下的方式解释代码。从上到下读取代码意味着当前有模型矩阵,然后在右侧不断地相乘。这意味着是从左向右解释的方式。这是什么意思呢?就是持续使用局部坐标系。因为编码时是从上到下,所以从左向右解释,使用局部坐标系更加方便。看到这个,你现在想做什么?你想建模一个铰接对象吧。什么是铰接对象?

Attendees 1 31:53 관절을 갖는 휴먼 같은 경우 어디가 중심일까 어디가 영광 코디네이트가 될까? 보통 펠비스라고 해서 이제 여기 100곡 정도 거기가 중심이 돼서 어떻게 돼요?
对于具有关节的人类,中心在哪里?哪里将成为荣耀坐标?通常是骨盆,大约在这里,它将成为中心,然后会怎样?

Attendees 1 32:10 여기가 영봉 코디네이트라고 하면은 왼쪽 다리가 일로 나가고 오른쪽 다리가 일로 나가고 밑으로 나가가지고 무릎이 나오고 또 무릎이 나오고 발목이 나오고 발목이 나오고 이런 것들이 다 이제 코디네이트가 된다는 얘기예요. 발목에서 발끝으로 가서 여기 발가락 5개가 또 나오고 발끝으로 가서 5개가 나오고 펠리스 기준으로 해서 스파인 4 오른 숄더 엘보 리스트, 왼쪽 엘보 숄더 엘보 리스트 뭐 이렇게 손가락 5개 나와서 이런 것들이 다 뭘로 되는 건가 하이라피컬하게 구조를 갖겠죠. 그래서 푸시 팝을 잘 쓰면은 이런 구조도 이제 모델링을 할 수 있고 여기서 내가 발을 이렇게 당이 한쪽을 들고 싶다 하면 어떻게 하면 돼요? 여기로 간 다음에 이 밑에 있는 애들은 다 얘 딸려 있는 자식들이죠. 그래서 여기에 로테이션만 회전을 딱 시키면은 이 밑에 있는 애들은 그냥 다 회전이 될 거예요. 그래서 변환 행렬을 잘 써야 되고 이런 명령어들을 잘 써야 되고 푸시 팝을 잘 써야 돼요.
如果说这是一个身体坐标系,左腿向一侧伸出,右腿向一侧伸出,向下延伸,出现膝盖,再出现膝盖,出现脚踝,再出现脚踝,这些都构成了坐标系。从脚踝到脚尖,这里出现 5 个脚趾,到脚尖又出现 5 个,以骨盆为基准,脊柱 4、右肩、肘、手腕,左肘肩手腕,手指 5 个,等等,这些都会形成一个层次化的结构。因此,如果巧妙使用压入弹出(push pop)操作,就可以进行这种建模。如果我想抬起一条腿,该怎么办?首先移动到这里,下面的所有部分都是它的子节点。只需对这里进行旋转,下面的所有部分都会随之旋转。所以必须要很好地使用变换矩阵,使用这些命令,并且要善用压入弹出操作。

Attendees 1 33:25 그래서 물론 이제 여러분도 숙제를 통해서 이런 것들을 좀 연습하는 시간을 당연히 갖겠죠.
当然,你们也会通过作业来练习这些内容。

Attendees 1 33:38 예를 들면 이런 애니메이션도 만들어낼 수 있겠죠. 이 사자 같은 경우는 계속 반시계 방향으로 돌아갈 거예요. 그다음에 이 오른편에 있는 자체는 시계 방향으로 막 돌아갈 거예요. 그럼 어떻게 하면 되나 이게 푸시 메이트릭스 현재는 이 가운데 있다고 가정을 할게요. 현재는 가운데 있다고 가정을 하고 푸시 메이트릭스에 야 뭔 일을 저질렀대
比如可以制作这样的动画。这只狮子会持续逆时针旋转。然后右边的自身将顺时针旋转。那么该如何做呢?现在假设它在中间,在推送矩阵中,喂,发生了什么事

Attendees 1 34:12 수업을 그만하라는 얘기인 것 같은데
听起来像是说要停止上课的意思

Attendees 1 34:25 이것만 딱 볼게요. GL 트랜슬레이트 마이너스 2 하면은 여기서 이제 한 칸 두 칸 가겠죠. 그다음에 로테이트 하면 간 상태에서 제트 축으로 이제 로테이트 1 앵글 1에서 앵글은 초음에 이제 0.0이니까 회전을 안 하겠지만 이 앵글 값이 바뀌면 회전하겠죠. 그다음에 드로우 오브젝트 하면은 회전된 축을 기준으로 4자를 그리겠죠. 그다음에 다시 팝 했어요. 그럼 어디로 오나 가운데 코디네이트로 오겠죠. 그다음에 또 푸시 매트릭스에서 이번에는 오른쪽으로 이동을 했어요. 좌표계를 그다음에 로테이트 앵글에서 앵글 2로 회전을 시키고 그다음에 드로 오브젝트에서 사이언색으로 이렇게 그림이 그려졌어요. 그래서 팝 하면 다시 어디로 와요? 중심으로 오겠죠. 그다음에 이제 이거는 이제 나중에 이제 타이머 오픈gl 타이머 관련해서 glut 타이머 관련해서 하는데 일정 시간마다 앵글 1은 5도씩 더해줬어요. 그러면은 어떻게 될까 앵글 값이 점점 커지겠죠. 그러면 이렇게 돌아가게 되겠죠.
与会者 1 34:25 我就看这个。如果 GL 平移负 2,那么现在就会向前移动一格或两格。然后旋转,在当前状态下围绕 Z 轴旋转,角度 1 最初为 0.0,所以不会旋转,但如果角度值变化,就会开始旋转。然后绘制对象,就会按照旋转轴绘制字符。然后又弹出了。那么会回到中心坐标。接着在推送矩阵时向右移动,然后围绕角度 2 旋转,然后绘制对象,以蓝色绘制图形。弹出后又会回到中心。然后这个是关于 OpenGL 定时器,GLUT 定时器,每隔一段时间角度 1 增加 5 度。那么角度值会逐渐变大,这样就会开始旋转。

Attendees 1 35:29 그다음에 앵글 2는 5도씩 빼줬어요. 그러면 어떻게 음수가 되니까 이쪽으로 돌아가게 되겠죠. 그래서 일정 시간이 지나면은 0.1초마다 혹은 0.2초마다 이렇게 이제 시간 간격을 정해서 얘는 계속 이쪽으로 회전하는 애가 될 테고 얘는 계속 이쪽으로 회전하는 애가 될 거예요. 이런 것도 만들 수 있고 이런 것들을 하기 위해서는 이제 glut의 기능을 조금 더 여러분이 알아야 될 거예요. 타이머라든가 키보드를 키보드 인풋을 처리하는 방식이라든가 마우스 인풋을 처리하는 방식이라든가 그런 glut의 사용자 입력을 처리하는 방식은 다음 주에 공부를 하도록 할게요. 질문 없으면 오늘 여기까지 할게요. 수고했습니다.
与会者 1 35:29 然后角度 2 每次减少 5 度。这样就会向负方向旋转。所以经过一段时间,每 0.1 秒或 0.2 秒,设定一个时间间隔,这个会持续向一个方向旋转,那个会持续向另一个方向旋转。可以制作这样的效果,但要了解 GLUT 的更多功能。比如定时器、处理键盘输入的方式、处理鼠标输入的方式,这些 GLUT 处理用户输入的方式我们将在下周学习。如果没有问题,今天就到这里。辛苦了。

clovanote.naver.com