OpenGL 로 렌 더 링 한 화려 한 안 드 로 이 드 애니메이션 라 이브 러 리
10181 단어 Android
1.설치
gradle:
dependencies { compile 'com.gplibs:magic-surface-view:1.0.0'}
2.예시 효과
이 문 서 는 간단 한 설명 만 하고 구체 적 인 사용 방법 은 예시 항목 을 참고 하 십시오.(위의 github 주 소 는 예시 항목 을 찾 을 수 있 습 니 다.)
다음은 예시 효과 입 니 다.
애니메이션 시작 및 종료:
MacWindow 애니메이션 모방:
다른 몇 가지 예시 효 과 는 예시 항목 의 실행 을 다운로드 하여 볼 수 있다.
3.개술
하나의 MagicSurface View 는 하나의 MagicScene 만 동시에 렌 더 링 할 수 있 습 니 다.하나의 MagicScene 은 여러 개의 MagicSurface 를 포함 할 수 있 습 니 다.하나의 MagicSurface 는 하나의 View 또는 Bitmap 대상 에 대응 할 수 있 습 니 다.
필드 생 성 및 렌 더 링
// Surface MagicSurface surface = new MagicSurface(view) // view View
.setVisible(true) // ( true)
.setShininess(64) // , 64; , , .
.setGrid(30, 40) // , , ; 30,30
.setEnableBlend(true) // ( )
.setEnableDepthTest(true) // ( )
.setModelUpdater(modelUpdater) // , ; "5. MagicSurfaceModelUpdater"
.setMatrixUpdater(matrixUpdater) // , ; "6. MagicSurfaceMatrixUpdater"
.drawGrid(false); // false. ( )// MagicScene scene = new MagicSceneBuilder(mSurfaceView)
.addSurfaces(surface) // Surface : addSurfaces(surface, surface1, surface2)
.ambientColor(0XFF222222) // , 0XFFFFFFFF
.addLights(light) // , PointLight DirectionalLight; : addLights(light, light1, light2)
.setUpdater(sceneUpdater) // , ; "4. MagicSceneUpdater"
.build();// myMagicSurfaceView.render(scene);
모델 업데이트 기 MagicSurface ModelUpdater 애니메이션 원리:
MagicSurface ModelUpdater 원 리 는 상대 적 으로 번 거 롭 습 니 다.
렌 더 링 은 OpenGL 을 사용 합 니 다.매 직 서 피 스 대상 마다 Surface Model 이라는 Surface Model 은 openGl 이 그 릴 곡면 모델 을 포함 합 니 다.Surface Model 에는 OpenGL 을 그 릴 때 필요 한 요소,정점 좌표 집합,정점 색인 집합,법 적 벡터 집합 등 이 포함 되 어 있다.매 직 서 피 스 를 만 들 때 뷰 에 들 어가 면 비트 맵 을 텍 스 처 로 곡면 모형 에 연결 합 니 다.곡면 모형 의 생 성 및 무늬 귀속 과정 은 모두 이 라 이브 러 리 에서 자동 으로 완성 된다.
우리 가 할 수 있 는 것 은 Surface Model 의 정점 집합 은 r(행)*c(열)의 직사각형 격자 입 니 다.이 사각형 격자 에 있 는 각 점 의 속성 렌 더 링 효 과 를 수정 하면 해당 하 는 변화 가 있 습 니 다.속성 포함:
정점 좌표.격자 위의 한 점 의 정점 좌 표를 수정 한 후 이 점 에 연 결 된 무늬 도 이에 상응하는 변형 이 발생 할 수 있다
정점 색.격자 에 있 는 한 점 의 정점 색 을 수정 한 후 이 점 의 최종 색 은'정점 최종 색 계산 과정'처럼 변 합 니 다
정점 최종 색상 계산 과정 은:
정점 최종 색=원색*정점 색*장면 환경 빛 색+원색*정점 색*조명 색 원색 이 MagicSurface 를 구축 할 때 들 어 오 는 View 또는 Bitmap 에서 생 성 된 무늬 는 좌표 의 색 값 에 대응 합 니 다.정점 색 은 기본적으로 rgba(1,1,1,1)입 니 다.모델 업데이트 기 에서 수정 할 수 있 습 니 다.장면 환경 빛 색상 은 기본적으로 rgba(1,1,1,1)입 니 다.MagicSceneUpdater 에서 수정 할 수 있 습 니 다.조명 색상 이 MagicScene 을 구축 할 때 들 어 오 는 조명 대상 은 모델 이 정점 에 대응 하 는 빛 색상 값 에 집합 합 니 다.조명 색상 값 을 rgba(0,0,0,0)로 설정 하지 않 으 면;MagicSceneUpdater 에서 수정 할 수 있 습 니 다.
색상 곱 하기 알고리즘 은(그 중에서 r,g,b,a 는 모두 0~1 의 부동 소수점 으로 대응 합 니 다.×××색상 값 0~255)color 1(r1,g1,b1,a1)*color 2(r2,g2,b2,a2)=color 3(r1*r2,g1*g2,b1*b2,a1*a2)색상 더하기 알고리즘(그 중 r,g,b,a 는 모두 0~1 의 부동 소수점 으로 대응 합 니 다.×××색상 값 0~255)color 1(r1,g1,b1,a1)+color 2(r2,g2,b2,a2)=color 3(r1+r2,g1+g2,b1+b2,a1+a2)
필드 좌표(즉 OpenGL 좌표):
좌표 와 관련 된 애니메이션 작업 은 모두 장면 좌 표를 사용 하 는데 안 드 로 이 드 의 View 좌표계 와 무관 하 다.MagicSurface View 의 중심 은 바로 장면 좌표 원점(0,0,0)이다.x 축방향 오른쪽 y 축방향 상 z 축방향 화면 밖.MagicSurface 그리드 모델 각 점 좌표 z 축 은 기본적으로 0 MagicSurface View 와 MagicSurface 관련 점 장면 좌표 획득 방법 참조"5.모델 업데이트 기 MagicSurface 모델 업데이트"
오프셋 에 대하 여:
MagicSurface 에서 모델 업데이트 기와 매트릭스 업데이트 기 를 동시에 사용 할 때 두 개 는 하나의 응용 오프셋 만 있 을 수 있 습 니 다.그렇지 않 으 면 위치 에 오차 가 생 길 수 있 습 니 다.편 이 량 은 모델 업데이트 기와 매트릭스 업데이트 기 를 참고 하 는 것 을 구체 적 으로 설명 한다.
Updater 성능 최적화:
MagicSceneUpdater,MagicSurface ModelUpdater 및 MagicSurface MatrixUpdater 는 모두 MagicUpdater 의 하위 클래스 입 니 다.여러 개의 MagicUpdater 가 실 행 될 때 그룹 을 나 누 는 것 을 고려 할 수 있 습 니 다.MagicUpdater 는 그룹 매개 변 수 를 전송 할 수 있 는 구조 함수 와 set Group 방법 으로 그룹 을 나 눌 수 있 습 니 다.(setGroup 은 render 방법 을 호출 하기 전에 실행 해 야 합 니 다.그룹 을 나 누 지 않 으 면 혼자서 스 레 드 업 데 이 트 를 시작 합 니 다.계 산 량 이 적은 MagicUpdater 를 같은 그룹 으로 나 누 면 자원 을 절약 하고 성능 을 향상 시 킬 수 있 습 니 다.
4.필드 업데이트 기 MagicSceneUpdater
MagicSceneUpdater 는 장면 변 수 를 수정 합 니 다.장면 변 수 는 환경 빛 과 광원 을 포함한다.
호출 과정 은 willStart->didStart->(update[이 부분 은 notifyChanged 를 통 해 Updater stop 방법 을 호출 할 때 까지 순환 호출 을 촉발 합 니 다]->didStop
public class MySceneUpdater extends MagicSceneUpdater { public MySceneUpdater(int group) { super(group);
} // ( )
@Override
protected void willStart(MagicScene scene) {
} //
// notifyChanged() update 。
@Override
protected void didStart(MagicScene scene) {
} // Updater stop()
@Override
protected void didStop(MagicScene scene) {
} //
@Override
protected void update(MagicScene scene, Vec outAmbientColor) { //
// outAmbientColor.setColor(...)
// 0
// PointLight pl = scene.getLight(0);
// pl.setColor(...);
// pl.setPosition(...);
// 1
// DirectionalLight dl = scene.getLight(1);
// dl.setColor(...);
// dl.setDirction(...);
// MagicSurface
// scene.getSurface(index);
}
}
5.모델 업데이트 기 MagicSurfaceModelUpdater
MagicSurface ModelUpdater 는 MagicSurface 격자 모델 의 정점 좌표 와 색상 값 을 수정 합 니 다.
호출 과정 은 willStart->didStart->(updateBegin->(updatePosition[격자 마다 옮 겨 다 니 기])->updateEnd[이 부분 은 notifyChanged 를 통 해 Updater stop 방법 을 호출 할 때 까지 순환 호출 을 촉발 합 니 다]->didStop
public class MyModelUpdater extends MagicSurfaceModelUpdater { public MyModelUpdater() {
} // ( )
@Override
protected void willStart(MagicSurface surface) {
} //
// notifyChanged() update 。
@Override
protected void didStart(MagicSurface surface) {
} // updater stop
@Override
protected void didStop(MagicSurface surface) {
} //
@Override
protected void updateBegin(MagicSurface surface) {
} /** * r , c outPos outColor * ( openGL ) * gc * * @param surface * @param r * @param c * @param outPos r c , * @param outColor rgba(1,1,1,1), */
@Override
protected void updatePosition(MagicSurface surface, int r, int c, Vec outPos, Vec outColor) {
} //
@Override
protected void updateEnd(MagicSurface surface) { // ,
// surface.getModel().updateModelNormal();
// stop() updater.
}
}
MagicSurface ModelUpdater 관련 방법 설명:
Updater 수명 주기 내 에 다음 과 같은 방법 들 은 모두 효과적으로 호출 할 수 있다.
// MagicSurfaceView openGL surface.getScene().getWidth();// MagicSurfaceView openGL surface.getScene().getHeight();// MagicSurfaceView openGL pos// surface.getScene().getPosition(0.0f, 0.0f, pos); MagicSurfaceView // surface.getScene().getPosition(0.0f, 1.0f, pos); MagicSurfaceView // surface.getScene().getPosition(1.0f, 0.0f, pos); MagicSurfaceView // surface.getScene().getPosition(1.0f, 1.0f, pos); MagicSurfaceView surface.getScene().getPosition(ratioX, ratioY, pos);// MagicSurface openGL surface.getModel().getWidth();// MagicSurface openGL surface.getModel().getHeight();// MagicSurface surface.getModel().getRowLineCount();// MagicSurface surface.getModel().getColLineCount();// MagicSurface r c openGL pos// : + ; SurfaceView View MagicSurfaceView .surface.getModel().getPosition(r, c, pos);// MagicSurface r c openGL pos// : surface.getModel().getPositionExcludeOffset(r, c, pos);
6.매트릭스 업데이트 기 MagicSurfaceMatrixUpdater
MagicSurface MatrixUpdater 는 MagicSurface 격자 모델 에 대해 각종 매트릭스 변환(크기 조정 회전 이동)을 진행 합 니 다.
호출 과정 은 willStart->didStart->(updateMatrix[이 부분 은 notifyChanged 를 통 해 Updater stop 방법 을 호출 할 때 까지 순환 호출 을 촉발 합 니 다]->didStop
public class MyMatrixUpdater extends MagicSurfaceMatrixUpdater { public MyMatrixUpdater(int gorup) { super(group);
} // ( )
@Override
protected void willStart(MagicSurface surface) {
} // ;
// notifyChanged() update 。
@Override
protected void didStart(MagicSurface surface) {
} // updater stop
@Override
protected void didStop(MagicSurface surface) {
} /** * * @param surface MagicSurface * @param offset offse , offset model * * View MagicSurface * View MagicSurfaceView offset。 * * @param matrix */
@Override
protected void updateMatrix(MagicSurface surface, Vec offset, float[] matrix) { // matrix
reset(matrix); //
scale(matrix, xScale, yScale, zScale); //
translate(matrix, x + offset.x(), y + offset.y(), z + offset.z()); //
// translate(matrix, x, y, z);
// axis angle 。
rotate(matrix, axis, angle); // : 。
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.